113 Stimmen

Gibt es Selected Tab Changed Event in der Standard-WPF-Tab-Steuerelement

Gibt es in WPF ein Ereignis, das verwendet werden kann, um festzustellen, wann ein TabControl der ausgewählten Registerkarte ändert?

Ich habe versucht, mit TabControl.SelectionChanged aber es wird oft ausgelöst, wenn die Auswahl eines Childs innerhalb einer Registerkarte geändert wird.

145voto

Jon Kragh Punkte 4289

Ich habe dies in den Handler eingebaut, damit es funktioniert:

void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (e.Source is TabControl)
    {
      //do work when tab is changed
    }
}

94voto

unexpectedkas Punkte 861

Wenn Sie die Einstellung x:Name Eigenschaft zu jeder TabItem als:

<TabControl x:Name="MyTab" SelectionChanged="TabControl_SelectionChanged">
    <TabItem x:Name="MyTabItem1" Header="One"/>
    <TabItem x:Name="MyTabItem2" Header="2"/>
    <TabItem x:Name="MyTabItem3" Header="Three"/>
</TabControl>

Dann können Sie zu jedem TabItem bei der Veranstaltung:

private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (MyTabItem1.IsSelected)
    // do your stuff
    if (MyTabItem2.IsSelected)
    // do your stuff
    if (MyTabItem3.IsSelected)
    // do your stuff
}

61voto

MicBig Punkte 681

Wenn Sie nur ein Ereignis haben wollen, wenn eine Registerkarte ausgewählt wird, ist dies der richtige Weg:

<TabControl>
    <TabItem Selector.Selected="OnTabSelected" />
    <TabItem Selector.Selected="OnTabSelected" />
    <TabItem Selector.Selected="OnTabSelected" />
    <!-- You can also catch the unselected event -->
    <TabItem Selector.Unselected="OnTabUnSelected" />
</TabControl>

Und in Ihrem Code

    private void OnTabSelected(object sender, RoutedEventArgs e)
    {
        var tab = sender as TabItem;
        if (tab != null)
        {
            // this tab is selected!
        }
    }

15voto

Nidonocu Punkte 12156

Sie können dieses Ereignis trotzdem nutzen. Überprüfen Sie einfach, ob das Absenderargument das Steuerelement ist, für das Sie sich tatsächlich interessieren, und wenn ja, führen Sie den Ereigniscode aus.

8voto

Nikola Novak Punkte 3759

Wenn Sie das MVVM-Muster verwenden, ist es unbequem (und bricht das Muster), den Event-Handler zu verwenden. Stattdessen können Sie jedes einzelne TabItem's Selector.IsSelected Eigenschaft auf eine Abhängigkeitseigenschaft in Ihrem Viewmodel und behandeln Sie dann die PropertyChanged Ereignisbehandler. Auf diese Weise wissen Sie genau, welche Registerkarte ausgewählt/abgewählt wurde, basierend auf dem PropertyName und Sie haben einen speziellen Handler für jede Registerkarte.

MainView.xaml

<TabControl>
 <TabItem Header="My tab 1" Selector.IsSelected="{Binding IsMyTab1Selected}"> ... </TabItem>
 <TabItem Header="My tab 2" Selector.IsSelected="{Binding IsMyTab2Selected}"> ... </TabItem>
</TabControl>

MainViewModel.cs

public bool IsMyTab1Selected {
 get { return (bool)GetValue(IsMyTab1SelectedProperty); }
 set { SetValue(IsMyTab1SelectedProperty, value); }
}
public static readonly DependencyProperty IsMyTab1SelectedProperty =
DependencyProperty.Register("IsMyTab1Selected", typeof(bool), typeof(MainViewModel), new PropertyMetadata(true, new PropertyChangedCallback(MyPropertyChanged)));

public bool IsMyTab2Selected {
 get { return (bool)GetValue(IsMyTab2SelectedProperty); }
 set { SetValue(IsMyTab2SelectedProperty, value); }
}
public static readonly DependencyProperty IsMyTab2SelectedProperty =
DependencyProperty.Register("IsMyTab2Selected", typeof(bool), typeof(MainViewModel), new PropertyMetadata(false, new PropertyChangedCallback(MyPropertyChanged)));

private void MyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
 if (e.Property.Name == "IsMyTab1Selected") {
  // stuff to do
 } else if (e.Property.Name == "IsMyTab2Selected") {
  // stuff to do
 }
}

Wenn Ihr MainViewModel es INotifyPropertyChanged statt DependencyObject dann verwenden Sie stattdessen dies:

MainViewModel.cs

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName) {
 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

public MainViewModel() {
 PropertyChanged += handlePropertyChanged;
}

public bool IsMyTab1Selected {
 get { return _IsMyTab1Selected ; }
 set {
  if (value != _IsMyTab1Selected ) {
   _IsMyTab1Selected = value;
   OnPropertyChanged("IsMyTab1Selected ");
  }
 }
}
private bool _IsMyTab1Selected = false;

public bool IsMyTab2Selected {
 get { return _IsMyTab2Selected ; }
 set {
  if (value != _IsMyTab2Selected ) {
   _IsMyTab2Selected = value;
   OnPropertyChanged("IsMyTab2Selected ");
  }
 }
}
private bool _IsMyTab2Selected = false;

private void handlePropertyChanged(object sender, PropertyChangedEventArgs e) {
 if (e.PropertyName == "IsMyTab1Selected") {
  // stuff to do
 } else if (e.PropertyName == "IsMyTab2Selected") {
  // stuff to do
 }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X