是否在标准WPF选项卡控件中选择了选项卡更改事件

Jon*_*agh 90 wpf events tabcontrol

在WPF中,是否有一个事件可用于确定TabControl选定的选项卡何时更改?

我尝试过使用TabControl.SelectionChanged但是当一个选项卡中的孩子选择被更改时,它会被多次激活.

Jon*_*agh 116

我把它绑在处理程序中以使其工作:

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

  • 或者只是添加`e.Handled = true`以防止它冒泡 (4认同)
  • 我认为这不起作用但后来我意识到我正在检查`sender`而不是`e.Source` (2认同)

小智 73

如果将x:Name属性设置为each TabItem:

<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>
Run Code Online (Sandbox Code Playgroud)

然后您可以访问活动中的每一个TabItem:

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
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*Big 45

如果您只想在选择选项卡时发生事件,这是正确的方法:

<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>
Run Code Online (Sandbox Code Playgroud)

在你的代码中

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

  • 我纠正了……有点。卫生部!当我尝试在 VS 中输入上述内容时,它给了我红色的波浪线,因此我认为这是错误的。但当我把它剪切并粘贴进去并盲目地按F5键时,令我惊讶的是,它竟然成功了。啊?!为什么会这样呢? (2认同)
  • 如何在代码中而不是 xaml 中访问“Selector.Selected”事件 (2认同)
  • @Ahmed_Faraz:`someTabItem.AddHandler(Selector.SelectedEvent, ....` (2认同)

Nid*_*ocu 14

你仍然可以使用那个事件.只需检查sender参数是否是您真正关心的控件,如果是,请运行事件代码.


Nik*_*vak 5

如果您使用的是 MVVM 模式,那么使用事件处理程序会很不方便(并且破坏了模式)。相反,您可以将每个单独的 TabItem 的Selector.IsSelected属性绑定到视图模型中的依赖项属性,然后处理PropertyChanged事件处理程序。这样您就可以确切地知道根据 选择/取消选择了哪个选项卡,PropertyName并且每个选项卡都有一个特殊的处理程序。

例子: MainView.xaml

<TabControl>
 <TabItem Header="My tab 1" Selector.IsSelected="{Binding IsMyTab1Selected}"> ... </TabItem>
 <TabItem Header="My tab 2" Selector.IsSelected="{Binding IsMyTab2Selected}"> ... </TabItem>
</TabControl>
Run Code Online (Sandbox Code Playgroud)

例子: 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
 }
}
Run Code Online (Sandbox Code Playgroud)

如果您的MainViewModelisINotifyPropertyChanged而不是DependencyObject,则使用此代替:

例子: 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
 }
}
Run Code Online (Sandbox Code Playgroud)