Як праграмна выбраць TabItem ў WPF TabControl

Я хацеў бы ведаць, як абраць пэўны TabItem ў wpf TabControl.

Я паспрабаваў гэтыя сильфона, але нічога не праца!

MyTabControl.SelectedIndex = x

MyTabControl.SelectedItem = MyTabItem

MyTabControl.SelectedValue = MyTabItem

MyTabItem.IsSelected = True
26

7 адказы

Як кажа @ Крыс, любы з першых трох рэчаў павінен праца і, як кажа @Phyxx, гэта не заўсёды рэальна працаваць. Праблема заключаецца ў тым, што некаторыя тонкім аб парадку змянення ўласцівасцей. Для працы вакол яго вы павінны дазволіць wpf выклікаць код закладак выбару ў свой час:

Dispatcher.BeginInvoke((Action)(() => MyTabControl.SelectedIndex = x));

Гэта робіць толькі тое, што робіць таймер Phyxx », але ў некалькі менш экстрым.

31
дададзена
Але <б> чаму гэта так? Прапанова працавала вялікая (+1), але я не магу перастаць баяцца, што робіць яго такім чынам толькі хавае праблему, якая пахавана ззаду. Пры выбары паміж мной рабіць нешта відавочна не так, і распрацоўшчык Microsoft, рабіць нешта відавочна не так, я б з самай бяспечнай коні - мяне.
дададзена аўтар Konrad Viltersten, крыніца
Маё меркаванне: у devels MS няправільна, але не «відавочна». wpf з'яўляецца складаным і недакладным API, і здаецца, няма «адзін правільны шлях», каб выкарыстоўваць яго. У выніку, вы, вядома, стварыць сітуацыю, што MS ня праверыць для чакаць, або абароны ад. У гэтым выпадку мы нейкім чынам усталёўваючы поле альбо занадта позна (так што ігнаруецца) або занадта рана (так яна будзе перапісаная). Ніхто, нават не Microsoft, не ведае, што правільнае час.
дададзена аўтар Adrian Ratnapala, крыніца
@Digifaktur, што амаль супакойвае мае нервы таксама. Я быў занадта рэзкі на Microsoft; GUI рамкі цяжка, таму што ўсе патэнцыйна атрымлівае апавяшчэнне аб усім астатнім, у тым, хто-ведае-такі парадак. Я добра з дыспетчар. * Invoke для шунтавання коды паміж патокамі, але я нервуюся, калі я павінен слепа выкарыстоўваць яго ў адным патоку толькі таму, што я не разумею, што адбываецца.
дададзена аўтар Adrian Ratnapala, крыніца
Добрыя моманты/абмеркаваньне ўсё вакол, +1. Мне не падабаецца ідэя Дыспетчар , альбо, што, як резьб на іншы шлях інструкцыі, калі ён павінен проста быць у стане прыняць тую ж самую каманду ў магістралі. Але гэта магчыма, як сказаў Адрыян - ён выклікаецца занадта рана, а пазней каманды перазапісаць - яна выклікаецца занадта позна, і прыёмнік не ведае, што рабіць. Падобна на тое, дрэнны дызайн на часткі MS », каб мець такі адключыцца, але думаю, гэта тое, што мы затрымаліся.
дададзена аўтар vapcguy, крыніца
Калі гэта супакойвае нервы - гэта цалкам нармальна, каб патэлефанаваць дыспетчару для некаторых дзеянняў wpf UI, гэта на самай справе лепшы спосаб пераканацца, што гэта адбываецца ў патрэбны час, у правай асяроддзі. Гэта асабліва актуальна для шматструменных прыкладанняў, або пры выкарыстанні задач. Адказ Адрыян павінен быць пазначаны як "адказ" - гэта самы правільны.
дададзена аўтар Digifaktur, крыніца

Усе вашыя прыклады, акрамя трэцяга, з'яўляюцца правільнымі і будуць працаваць. Праблема павінна быць у іншым месцы. Можа быць, вы скідаеце дэталь пасля ўстаноўкі або ваш код ніколі не выклікаецца?

Valid

MyTabControl.SelectedIndex = x   
MyTabControl.SelectedItem = MyTabItem    
MyTabItem.IsSelected = True 

Invalid

MyTabControl.SelectedValue = MyTabItem 
19
дададзена

Цыкл па TabItems і на ўкладцы, каб выбраць, усталяваць

tabItem.IsSelected = true

Калі ёсць якія-небудзь іншае месца з-за звязвання змены вы будзеце бачыць праблему. У адваротным выпадку, прыведзены вышэй код павінен працаваць.

12
дададзена
Лепшы адказ далёка !!
дададзена аўтар Andreas, крыніца
Так. Гэта была дапамога мне. Ён павінен быць правільны адказ.
дададзена аўтар Mosquito Mike, крыніца

Адна рэч, якая не была згаданая вышэй:

Асноўная прычына, што нешта накшталт гэтага не будзе працаваць у тым, што ўкладка элементы не маюць «Name» набор уласцівасцяў. Кожная ўкладка элемент кіравання ўкладкі, якія вы хочаце, каб перайсці да праграмна павінен мець сваё ўласцівасць імя, усталяванае для любога з прыведзенага вышэй кода для працы.


9
дададзена
Гэта працуе для мяне. На дынамічна ствараныя ўкладках ні адзін з метад павінны працаваць і зрабіў. Я дадаў імёны ўсіх з іх, і яны пачалі працаваць, як чакалася.
дададзена аўтар Craig Neil Brown, крыніца

Я рэалізаваў рашэнне на аснове невялікі MVVM прывязак для выбару ўкладкі панэлі прагматычна.

  1. define a property in your view model - Selected int type

  2. bind the property in your view

  3. private int _selected;

    public int Selected
    {
        get { return _selected; }
        set
        {
            _selected = value;
            OnPropertyChanged("Selected");
        }
    }
    
  4. Set the value to Select property, simply the binding will activate the tab panel.

    if you want to navigate from tab panel inside parent tab panels, this solution will simply works, All you need to do is, access the data context of your control and set it

    // set the property value of the view model which points the index of the tab controller.
    ((CandidateViewModel)((System.Windows.FrameworkElement)candidateTab.Content).DataContext).Selected = CandidateLogTabIndex;
    
3
дададзена

Я спрабаваў ўсе метады, павінны працавалі, але як ты нічога фактычна змяніў выбраную ўкладку. У рэшце рэшт, я атрымаў яго на працу, паставіўшы код выбару укладкі ў DispatcherTimer кляшча.

       DispatcherTimer switchTabTimer = new DispatcherTimer();
       switchTabTimer.Interval = new TimeSpan(0);
       switchTabTimer.Tick += (object timerSender, EventArgs timerE) =>
       {
           myTabControl.SelectedIndex = 0;
           switchTabTimer.Stop();
       };
       switchTabTimer.Start(); 
1
дададзена
Зараз гэта непрыгожа
дададзена аўтар lahjaton_j, крыніца

Паспрабуйце ўсталяваць MyTabControl.SelectedIndex = х у апрацоўшчык падзеі DataContextChanged або Loaded вашага карыстацкага інтэрфейсу. Спадзяюся, што гэта будзе працаваць.

1
дададзена