WPF TabControl-da TabItem dasturiy usulini tanlash

WPF TabControl-da ma'lum bir TabItem ni qanday tanlashni bilishni istayman.

Men bu jarohatni sinab ko'rdim, lekin hech narsa ishlamaydi!

MyTabControl.SelectedIndex = x

MyTabControl.SelectedItem = MyTabItem

MyTabControl.SelectedValue = MyTabItem

MyTabItem.IsSelected = True
26

7 javoblar

@Chris'in aytganidek, dastlabki uch narsaning har biri ishlaydi va @Phyxx aytganidek, u har doim ham ishlamaydi. Muammoni mulkni o'zgartirish tartibi haqida ba'zi nozik narsa. Buning uchun wpf o'zingizning tab-saylov kodingizni o'z vaqtida chaqirishiga ruxsat berishingiz kerak:

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

Bu Phyxxning taymerini nima qiladi, lekin bir oz kamroq darajada o'ta darajada.

31
qo'shib qo'ydi
Lekin nima uchun shundaymi? Taklif juda yaxshi ishladi (+1), lekin shuni qilishdan qo'rqishni bas qila olmayman, faqat ortda qolgan bir muammoni yashiradi. Mening o'rtamizda qaror qabul qilayotib, Microsoft tomonidan ishlab chiqaruvchining aniq noto'g'ri ish qilgani menda eng xavfsiz ot bilan boraman.
qo'shib qo'ydi muallif Konrad Viltersten, manba
Mening taxminimcha: MS Devels noto'g'ri, lekin "ochiq" emas. wpf murakkab va loyqa API bo'lib, uni ishlatish uchun "bitta to'g'ri yo'ldir" emas. Natijada, siz MS kutish yoki sinovdan o'tish uchun test qilmagan vaziyatni yaratasiz. Bunday holda, biz biron-bir tarzda juda kech (ya'ni e'tiborga olinmaydi) yoki juda erta (shuning uchun u yoziladi) maydonni yaratmoqdamiz. Hech kim, hatto Microsoft ham, to'g'ri vaqtni bilmaydi.
qo'shib qo'ydi muallif Adrian Ratnapala, manba
@Digifaktur, bu mening nervlarni ham deyarli tinchitadi. Men Microsoft-da juda qattiq edi; GUI ramkalari qiyin, chunki hamma narsa boshqa har qanday narsa to'g'risida ogohlantiriladi, kim biladi-qanday buyurtma. dispatcher bilan ishlayman. * Mavzular orasida manfat kodi uchun invoke bilan ishlating, lekin nima sodir bo'layotganini tushunmasligim sababli, uni bitta ish zarrachasida ko'r-ko'rona ishlatishim kerak bo'lsa asabiylashadi.
qo'shib qo'ydi muallif Adrian Ratnapala, manba
Yaxshi fikrlar/munozarasi atrofida, +1. Dispatcher fikrini yoqtirmayman, bu faqatgina asosiy satrda xuddi shu ko'rsatmaga ega bo'lishi kerak bo'lgan boshqa yo'l yo'riqnomasiga o'xshash. Ammo Adrian aytganidek, bu juda tez orada chaqiriladi va keyinchalik unga buyruq yoziladi - bu juda kech deyiladi va qabul qiluvchining nima qilish kerakligini bilmaydi. Milodiy qismida kichkinagina dizaynga o'xshaydi, shuning uchun biz bunday aloqani uzishimiz kerak, ammo bu bizni qoqib tashlagan narsadir.
qo'shib qo'ydi muallif vapcguy, manba
Agar sizning nervlarni susaytirsa, dispetcherni ba'zi wpf UI harakatlariga chaqirish juda yaxshi, bu to'g'ri sharoitda, to'g'ri sharoitda bo'lishiga ishonch hosil qilishning eng yaxshi usuli. Bu, ko'p ishladigan ilovalar uchun yoki vazifalarni ishlatganda foydalidir. Adrianning javobi "javob" deb belgilanishi kerak - bu eng to'g'ri yo'ldir.
qo'shib qo'ydi muallif Digifaktur, manba

Uchunidan tashqari barcha misollar to'g'ri va ishlaydi. Muammo boshqa joyda bo'lishi kerak. Ehtimol, siz sozlamasdan keyin narsani tiklashingiz mumkin yoki kodingizni hech qachon chaqirishmaydi?

Valid

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

Invalid

MyTabControl.SelectedValue = MyTabItem 
19
qo'shib qo'ydi

TabItems-da va tanlanadigan yorliqda pastadir

tabItem.IsSelected = true

Agar majburiy almashtirish tufayli boshqa joylar mavjud bo'lsa, siz muammo ko'rasiz. Aks holda yuqoridagi kod ishlashi kerak.

12
qo'shib qo'ydi
Juda yaxshi javob!
qo'shib qo'ydi muallif Andreas, manba
Yep. Bu menga yordam berdi. Bu to'g'ri javob bo'lishi kerak.
qo'shib qo'ydi muallif Mosquito Mike, manba

Yuqorida aytib o'tilmagan narsalardan biri:

Buning asosiy sababi ishlamaydi, chunki yorliq elementlari "Od" xususiyatiga ega emas. Dasturiy jihatdan o'tishni istagan tab boshqarmasining har bir yorlig'i yuqoridagi kodlardan har biri uchun o'rnatilgan nomning xususiyatiga ega bo'lishi kerak.


9
qo'shib qo'ydi
Bu men uchun ishladi. Dinamik ravishda yaratilgan tablar bo'yicha ishlashning hech qanday usuli bajarilmadi. Men ularning barchasiga nom qo'ydim va ular kutilganidek ish boshladilar.
qo'shib qo'ydi muallif Craig Neil Brown, manba

Men tab panellarini pragmatik tanlash uchun kichik MVVM bindings asosidagi yechimini amalga oshirdim.

  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
qo'shib qo'ydi

ishlaydigan barcha usullarni sinab ko'rdim, lekin siz kabi hech narsa tanlangan yorliqni o'zgartirmadi. Natijada men buni DispatcherTimer belgisiga yorliq tanlash kodini qo'yib ishladim.

       DispatcherTimer switchTabTimer = new DispatcherTimer();
       switchTabTimer.Interval = new TimeSpan(0);
       switchTabTimer.Tick += (object timerSender, EventArgs timerE) =>
       {
           myTabControl.SelectedIndex = 0;
           switchTabTimer.Stop();
       };
       switchTabTimer.Start(); 
1
qo'shib qo'ydi
endi bu yomon
qo'shib qo'ydi muallif lahjaton_j, manba

DataContextChanged yoki Loaded yoki MyTabControl.SelectedIndex = x parametrlarini Loaded

1
qo'shib qo'ydi