WPF TabControl ішіндегі TabItem бағдарламасын бағдарламалы түрде қалай таңдауға болады

WPF TabControl ішіндегі белгілі бір TabItem қалай таңдау керектігін білгім келеді.

Мен бұған тырысамын, бірақ ештеңе жұмыс істемейді!

MyTabControl.SelectedIndex = x

MyTabControl.SelectedItem = MyTabItem

MyTabControl.SelectedValue = MyTabItem

MyTabItem.IsSelected = True
26

7 жауаптар

@Chris қалай айтады, бірінші үш элементтерінің кез келгені жұмыс істейді және @Phyxx дейді, бұл әрдайым жұмыс істемейді. Мәселе мүлікті өзгерту тәртібі туралы нәзік нәрсе. Оны айналып өту үшін, wpf өзіңіздің табуляция таңдау кодын өз уақытыңызда көрсетуге рұқсат етуіңіз керек:

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

Бұл Phyxx таймері не істейді, бірақ сәл кемірек.

31
қосылды
Бірақ неге солай? Ұсыныс өте жақсы жұмыс істеді (+1), бірақ мен мұны істеп қоймас бұрын, көміліп жатқан мәселені жасырады деп қорықпаймын. Менімен бір нәрсе жасағанда, Майкрософстің әзірлеушісі қателесіп кететін нәрсе жасап, мен ең қауіпсіз атпен жүретін боламын.
қосылды автор Konrad Viltersten, көзі
Менің болжауымша, MS девельдер қателеседі, бірақ «ашық» емес. wpf - бұл күрделі және анық емес API, және оны пайдаланудың ешқандай «дұрыс жолы» жоқ сияқты. Соның салдарынан MS MS күтпеген немесе күшінен қорғай алмайтын жағдай тудырады. Бұл жағдайда біз қандай да бір жолды да тым кеш (сондықтан елемейді) немесе тым ерте (сондықтан ол қайта жазылады). Ешкім де, тіпті Майкрософт, дұрыс уақытты білмейді.
қосылды автор Adrian Ratnapala, көзі
@Digifaktur, ол менің нервтерімді де тыныштандырады. Мен Microsoft-та қатал болдым; GUI шеңберлері қиын, өйткені бәрі басқа туралы барлық ақпаратты алады, кім біледі-қандай тәртіпте. Мен Диспетчермен жұмыс істеймін. деп аталады. - тақырыптар арасында манипуляциялық коды үшін, бірақ мен не болып жатқанын түсінбейтіндіктен, оны тек бір ғана жіпте соқыр түрде қолдануға тура келгенде көңілім түседі.
қосылды автор Adrian Ratnapala, көзі
Жақсы пікірлер/талқылау, +1. Диспетчер идеясын ұнатпаймын, ол тек қана негізгі жолда бірдей нұсқаулықты қабылдауы керек болған кезде басқа нұсқа жолына ұқсас. Бірақ бұл Адриан сияқты айтылғандай, бұл тым тез арада қабылданады, кейінірек ол бұған жазбайды - бұл тым кеш деп аталады, және алушы не істеу керектігін білмейді. Массачусетс бөліктерінің біреуі де жаман емес дизайны сияқты сезіледі, бірақ бұл бізді ұстап қалды.
қосылды автор 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, көзі

Жоғарыда айтылмаған бір нәрсе:

Осындай нәрселердің басты себебі жұмыс істемейді - бұл қойынды элементтерінде «Ат» сипатының жиынтығы жоқ. Бағдарламалық құралға жылжытқыңыз келетін қойынды басқару элементінің әрбір қойындысы жоғарыда көрсетілген кодтың кез келгені үшін атау сипатына ие болуы керек.


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, көзі

DataContextChanged немесе Loaded оқиғалар өңдегішінде MyTabControl.SelectedIndex = x орнатыңыз. Бұл жұмыс істейтініне үміттенемін.

1
қосылды