WPF TabControl içinde bir TabItem nasıl programlanır

WPF TabControl içinde belirli bir TabItem nasıl seçileceğini bilmek istiyorum.

Bu feryatı denedim ama hiçbir şey işe yaramadı!

MyTabControl.SelectedIndex = x

MyTabControl.SelectedItem = MyTabItem

MyTabControl.SelectedValue = MyTabItem

MyTabItem.IsSelected = True
26

7 cevap

@Chris'in dediği gibi, yapmalı ilk üç şeyden herhangi biri ve @Phyxx'in söylediği gibi, her zaman gerçekten işe yaramıyor. Sorun, mülkiyet değişikliklerinin düzeni hakkında bazı ince şey. Etrafında çalışmak için WPF'nin sekme seçim kodunuzu kendi zamanında çağırmasına izin vermeniz gerekir:

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

Bu sadece Phyxx 'zamanlayıcısının yaptığı, ama biraz daha az aşırı bir şekilde yapar.

31
katma
Ama neden öyle? Öneri harika çalıştı (+1) ancak bunu yapmanın sadece gömülü bir sorunu gizlediğinden korkmam. Aramızda bariz bir şekilde yanlış karar verirken ve Microsoft'un geliştiricisi açıkça yanlış bir şey yaptığında, en güvenli at ile giderdim - ben.
katma yazar Konrad Viltersten, kaynak
Benim tahminim: MS devels yanlış, ama "bariz bir şekilde" değil. WPF, karmaşık ve bulanık bir API'dir ve bunu kullanmak için "doğru bir yol" yoktur. Sonuç olarak, MS'in beklediği gibi test etmediği veya koruyamadığı bir durum yaratacaktır. Bu durumda bir şekilde ya çok geç (ya da göz ardı edilir) ya da çok erken bir tarih belirliyoruz (yani üzerine yazılır). Kimse, Microsoft bile değil, doğru zamanın ne olduğunu bilmiyor.
katma yazar Adrian Ratnapala, kaynak
@Digifaktur, neredeyse sinirlerimi yatıştırıyor. Microsoft için çok sert davrandım; GUI çerçeveleri zordur çünkü her şey potansiyel olarak her şey hakkında, kim bilir-hangi sırayla haberdar edilir. Dispatcher ile iyiyim. * Thread'ler arasında kodlama yapmak için çağırın, ancak ne olduğunu anlamadığım için körü körüne tek bir iş parçacığı içinde kullanmam gerektiğinde sinirleniyorum.
katma yazar Adrian Ratnapala, kaynak
Her tarafta iyi puanlar/tartışmalar, +1. Aynı yönergeyi ana hatta alabilmesi gerektiğinde, farklı bir komut yoluna sahip olmak gibi Dispatcher fikrini de beğenmiyorum. Ama bu, Adrian'ın dediği gibi - çok erken çağrılır ve daha sonra komutların üzerine yazılır - çok geç çağrılır ve alıcı ne yapacağını bilmez. MS 'bölümünün zayıf bir tasarıma benzemesi, bu tür bir bağlantıyı kesmek için geliyor, ama sanırım sıkıştığımız şey bu.
katma yazar vapcguy, kaynak
Sinirlerinizi yatıştırırsa - bazı wpf UI eylemleri için dağıtıcıyı çağırmak çok normaldir, aslında doğru zamanda, doğru ortamda olduğundan emin olmanın en iyi yolu. Bu, çok parçalı uygulamalar için veya Görevler'i kullandığınızda özellikle geçerlidir. Adrian'ın cevabı "cevap" olarak işaretlenmelidir - en doğru olanıdır.
katma yazar Digifaktur, kaynak

Üçüncü olan dışındaki tüm örnekleriniz doğru ve işe yarayacak. Sorun başka bir yerde olmalı. Belki de ayarladıktan sonra öğeyi sıfırladınız veya kodunuz hiç aramıyor mu?

Valid

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

Invalid

MyTabControl.SelectedValue = MyTabItem 
19
katma

TabItems içinden ve seçilecek sekme için döngü oluşturun

tabItem.IsSelected = true

Bağlanma nedeniyle başka bir yer varsa sorun görürsünüz. Aksi takdirde, yukarıdaki kod çalışmalıdır.

12
katma
Uzakta en iyi cevap!
katma yazar Andreas, kaynak
Evet. Bu bana bir yardımcı oldu. Doğru cevap olmalı.
katma yazar Mosquito Mike, kaynak

Yukarıda belirtilmeyen bir şey:

Bunun gibi bir işe yaramayacak ana neden, sekme öğelerinin "Ad" özellik kümesine sahip olmamasıdır. Programatik olarak gezinmek istediğiniz sekme denetiminin her sekme öğesi, yukarıdaki kodun çalışması için ad özelliğinin sahip olması gerekir.


9
katma
Bu benim için çalıştı. Dinamik olarak oluşturulmuş sekmelerde, çalışma yöntemlerinin hiçbiri işe yaramadı. Hepsine isimler ekledim ve beklediğim gibi çalışmaya başladılar.
katma yazar Craig Neil Brown, kaynak

Sekmeli panelleri pragmatik olarak seçmek için küçük bir MVVM bağlama çözümü uyguladı.

  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
katma

'in çalıştığı tüm yöntemleri denedim, ancak sizin gibi hiçbir şey seçili sekmeyi değiştirmedi. Sonunda sekme seçim kodunu DispatcherTimer seçeneğine koyarak çalıştım.

       DispatcherTimer switchTabTimer = new DispatcherTimer();
       switchTabTimer.Interval = new TimeSpan(0);
       switchTabTimer.Tick += (object timerSender, EventArgs timerE) =>
       {
           myTabControl.SelectedIndex = 0;
           switchTabTimer.Stop();
       };
       switchTabTimer.Start(); 
1
katma
şimdi çirkin
katma yazar lahjaton_j, kaynak

UI'nizin DataContextChanged veya Loaded olay işleyicisindeki MyTabControl.SelectedIndex = x 'i ayarlamayı deneyin. Umarım bu işe yarar.

1
katma