web-dev-qa-db-fra.com

Comment sélectionner par programme un TabItem dans WPF TabControl

Je voudrais savoir comment sélectionner un TabItem spécifique dans un WPF TabControl. 

J'ai essayé ces ci-dessous mais rien ne marche!

MyTabControl.SelectedIndex = x

MyTabControl.SelectedItem = MyTabItem

MyTabControl.SelectedValue = MyTabItem

MyTabItem.IsSelected = True
29
Pierre Toutant

Comme @Chris le dit, aucune des trois premières choses devrait ne fonctionne et comme @Phyxx, cela ne fonctionne pas toujours. Le problème est quelque chose de subtil à propos de l'ordre des changements de propriété. Pour contourner ce problème, vous devez laisser le WPF appeler votre code de sélection par tabulation à son propre rythme:

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

Cela fait exactement ce que fait le minuteur de Phyxx, mais d'une manière un peu moins extrême.

34
Adrian Ratnapala

Tous vos exemples sauf le troisième sont corrects et fonctionneront. Le problème doit être à un autre endroit. Peut-être que vous réinitialisez l'élément après la configuration ou que votre code n'est jamais appelé? 

Valable  

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

Invalide  

MyTabControl.SelectedValue = MyTabItem 
21
HCL

Parcourez les TabItems et pour que l’onglet soit sélectionné, définissez

tabItem.IsSelected = true

S'il y a un autre endroit en raison d'un changement de lien, vous verrez un problème. Sinon, le code ci-dessus devrait fonctionner.

13
kishhr

Une chose qui n'a pas été mentionnée ci-dessus: 

La principale raison pour laquelle cela ne fonctionne pas est que les éléments de l'onglet ne possèdent pas la propriété "Nom". Chaque élément d'onglet du contrôle d'onglet auquel vous souhaitez accéder par programme doit avoir sa propriété name définie pour que l'un des codes ci-dessus fonctionne. 

<tabItem Name="tab1"></tabItem>
11
user2976441

J'ai implémenté une petite solution basée sur les liaisons MVVM pour sélectionner les panneaux d'onglets de manière pragmatique. 

  1. définir une propriété dans votre modèle de vue - Type int sélectionné 

  2. lier la propriété dans votre vue

    <TabControl
        x:Name="TabsCandidate" 
        VerticalAlignment="Stretch" 
        TabStripPlacement="Top"
        SelectedIndex="{Binding Selected}"
    
  3. privé int _selected;

    public int Selected
    {
        get { return _selected; }
        set
        {
            _selected = value;
            OnPropertyChanged("Selected");
        }
    }
    
  4. Définissez la valeur sur Sélectionnez propriété, simplement la liaison activera le panneau d'onglets. 

    si vous souhaitez naviguer à partir d'un panneau d'onglets à l'intérieur d'un panneau d'onglets parent, cette solution fonctionnera simplement.

    // 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;
    
5
Shanjee

J'ai essayé toutes les méthodes qui devraient auraient fonctionné, mais comme vous, rien n'a réellement changé l'onglet sélectionné. En fin de compte, je l'ai fait fonctionner en mettant le code de sélection d'onglets dans un tick DispatcherTimer.

       DispatcherTimer switchTabTimer = new DispatcherTimer();
       switchTabTimer.Interval = new TimeSpan(0);
       switchTabTimer.Tick += (object timerSender, EventArgs timerE) =>
       {
           myTabControl.SelectedIndex = 0;
           switchTabTimer.Stop();
       };
       switchTabTimer.Start(); 
1
Phyxx

Essayez de définir le MyTabControl.SelectedIndex = x dans le gestionnaire d'événements de DataContextChanged ou Loaded de votre interface utilisateur. J'espère que cela fonctionnera.

1
Debasis

si vous ne connaissez pas l'index de l'onglet (indiquez son pas TabIndex) utilisez:

    private async Task ChangeTabTo(TabItem wantedTab) {
        int index = 0;
        for (var i = 0; i < TabControl.Items.Count; i++) {
            var tab = TabControl.Items[i];
            var t = tab as TabItem;
            if (t == null) continue;
            if (t == wantedTab) {
                index = i;
                break;
            }
        }

        await Dispatcher.BeginInvoke((Action)(() => TabControl.SelectedIndex = index));
    }

ou modifiez-le pour rechercher par nom si vous ne voulez pas garder une référence à l'onglet

0
GreyCloud