54 votes

En C# WPF, pourquoi l'événement SelectionChanged de mon TabControl se déclenche-t-il trop souvent ?

J'ai une interface graphique à onglets dont chaque onglet contient un cadre. Dans l'un de ces cadres se trouve une grille de données. Lorsque l'utilisateur sélectionne cet onglet, j'ai besoin que ma grille de données soit triée. J'utilise donc l'événement SelectionChanged du TabControl pour déclencher le tri. Cependant, cet événement se déclenche chaque fois qu'un élément est sélectionné dans la grille de données, même si les onglets eux-mêmes restent inchangés.

J'ai essayé un certain nombre d'événements différents : GotFocus pour un élément d'onglet RequestBringIntoView pour un élément d'onglet

mais ils semblent tous souffrir de ce problème. Quelle en est la cause ?

91voto

Arcturus Points 14366

El TabControl.SelectionChanged est le même événement qu'un ComboBox.SelectionChanged

Il provient de Selector.SelectionChanged .

Ainsi, si vous ne marquez pas votre événement comme étant traité dans votre gestionnaire d'événements, il remontera dans l'arbre et finira par arriver à votre gestionnaire d'événements. TabControl ce qui cause ce problème de "tirs trop fréquents".

Marquez votre événement comme traité dans votre SelectionChanged de votre ComboBox / ListBox / ListView /ou tout autre sélecteur que vous utilisez dans votre grille de données, comme suit :

private void MyComboBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    e.Handled = true;
}

Et ce désagrément disparaîtra ;).

25voto

Towhid Points 634
     private void tabControlName\_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.Source is TabControl) //if this event fired from TabControl then enter
            {
                if (tabItemName.IsSelected)
                {
                    //Do your job here
                }
            }
        }

3voto

Chris Valentine Points 15990

Si vous avez ajouté un gestionnaire avec AddHandler dans un élément parent, tous les changements de sélection déclencheront le SelectionChanged-event. Dans ce cas, vous pouvez donner un nom à votre TabControl et vérifier ensuite dans l'EventHandler si le nom de l'OriginalSource correspond au nom de votre TabControl.

2voto

Shimmy Points 23393

Une autre bonne approche consiste à ajouter un gestionnaire au tabControl.Items.SelectionChanged :

private void Window_Loaded(object sender, RoutedEventArgs e)
{
  ItemCollection view = tabControl.Items;
  view.CurrentChanged += new EventHandler(view_CurrentChanged);
}

void view_CurrentChanged(object sender, EventArgs e)
{
  throw new NotImplementedException();
}

Ce n'est peut-être pas la méthode xamly, mais elle est moins pénible car elle ne se déclenche que lorsqu'un élément est modifié.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X