WPF TabControl - Impossible de sélectionner par programmation les onglets
J'ai une interface utilisateur avec un TabControl qui affiche une page de démarrage. D'autres éléments peuvent être ajoutés par un double-clic sur le contenu, par exemple, une grille de données. De nouveaux onglets doivent être sélectionnés lorsqu'ils sont créés. Si le document correspondant à l'élément de la grille est déjà ouvert, puis l'onglet existant pour que le document devrait être ouvert plutôt que d'en créer un nouveau.
Je sais que je devrais être capable de programmation pour sélectionner un onglet en définissant le TabControl est SelectedItem ou SelectedIndex propriétés. Toutefois, l'onglet désiré jamais réellement active. Si j'ai mis un et puis inspectez le TabControl de l'état dans le débogueur, puis les deux domaines semblent mettre à jour correctement. Cependant, après je continue l'exécution, je vois que l'onglet sélectionné reste inchangé dans l'INTERFACE utilisateur, et si je fais une pause et d'inspecter le TabControl de l'état de nouveau je vois que le SelectedItem et SelectedIndex sont retournés à leurs valeurs précédentes. La sélection d'un onglet en cliquant dessus dans l'INTERFACE utilisateur, d'autre part, fonctionne très bien.
Voici la déclaration pour le TabControl:
<TabControl x:Name="Tabs" >
<TabItem x:Name="StartPageTab" Header="Start Page" DataContext="{Binding Path=StartPageViewModel}">
...
</TabItem>
</TabControl>
Et le code permettant d'ajouter et de sélectionner les onglets:
private void _SelectTab(MyViewModel model)
{
TabItem tab;
if (_TryFindTab(model, out tab)) Tabs.SelectedItem = tab;
}
private bool _TryFindTab(MyViewModel target, out TabItem tab)
{
foreach (TabItem item in Tabs.Items)
{
MyViewModel model = item.DataContext as MyViewModel;
if (model != null && model.Equals(target))
{
tab = item;
return true;
}
}
tab = null;
return false;
}
private void _AddTab(MyViewModel model)
{
TabItem tab = new TabItem { DataContext = model, Content = new MyView() };
Binding bind = new Binding { Source = model, Path = new PropertyPath("Name") };
tab.SetBinding(TabItem.HeaderProperty, bind);
Tabs.Items.Add(tab);
Tabs.SelectedItem = tab;
}
source d'informationauteur Sean U
Vous devez vous connecter pour publier un commentaire.
Il s'est avéré être lié à quelque chose que j'idéalement omis de l'original de la description du problème:
La grille de données en question était dans le contenu de StartPageTab. J'ai été manutention double-clique sur le DataGrid par la capture de son MouseDoubleClick de l'événement, la recherche de l'arbre visuel pour trouver ce DataGridRow a double-cliqué sur l'icône (le cas échéant), et puis en soulevant un événement qui a fini par être capturé par la fenêtre principale, qui permettraient de répondre par l'appel de l'une _SelectTab ou _AddTab, selon que le document en question a déjà été ouverte.
À quel point, la pile d'appel dérouler et de revenir à MouseDoubleClick gestionnaire d'événement. Dans ce gestionnaire, j'ai oublié de définir le MouseButtonEventArgs est traité de la propriété à true. Donc, WPF continué à chercher pour quelqu'un d'autre pour gérer cet événement click - et l'élément qu'il a finalement trouvé permettrait de répondre en demandant, pour la concentration, ce qui signifiait que l'onglet d'origine nécessaires pour obtenir le focus.
Ajoutant
e.Handled = true;
arrêté que les gâchis dans son élan, de sorte que le nouvel onglet pourrait rester sélectionné.Vous pouvez essayer d'utiliser l'onglet.focus()
J'ai des onglets dans mon application et c'est un moyen rapide pour faire de votre onglet sélectionné visible.
Avez-vous essayé de liaison à TabItem.IsSelected et la mise à jour que vous affichez modèle?
Dans une ancienne application en C#, j'ai eu, à l'aide de contrôles de la page, j'ai été en mesure de forcer la page active en racontant l'onglet objet de contrôle pour sélectionner l'onglet...