Есть ли в WPF событие, которое можно использовать для определения TabControl
изменения выбранной вкладки?
Я пробовал использовать, TabControl.SelectionChanged
но он много раз запускается, когда изменяется выбор ребенка на вкладке.
wpf
events
tabcontrol
Джон Краг
источник
источник
sender
вместоe.Source
e.Handled = true
чтобы он не пузырилсяЕсли вы установите
x:Name
свойство для каждого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>
Затем вы можете получить доступ к каждому
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 }
источник
Если вы просто хотите, чтобы событие происходило при выборе вкладки, это правильный способ:
<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>
И в вашем коде
private void OnTabSelected(object sender, RoutedEventArgs e) { var tab = sender as TabItem; if (tab != null) { // this tab is selected! } }
источник
Вы все еще можете использовать это событие. Просто убедитесь, что аргумент отправителя - это элемент управления, который вам действительно нужен, и если да, запустите код события.
источник
Сгенерированное событие всплывает, пока не будет обработано.
Эта часть xaml ниже срабатывает
ui_Tab_Changed
после того,ui_A_Changed
как элемент, выбранный вListView
изменениях, независимо отTabItem
изменения вTabControl
.<TabControl SelectionChanged="ui_Tab_Changed"> <TabItem> <ListView SelectionChanged="ui_A_Changed" /> </TabItem> <TabItem> <ListView SelectionChanged="ui_B_Changed" /> </TabItem> </TabControl>
Нам нужно потреблять событие в
ui_A_Changed
(ui_B_Changed
и т. Д.):private void ui_A_Changed(object sender, SelectionChangedEventArgs e) { // do what you need to do ... // then consume the event e.Handled = true; }
источник
Это правильное событие. Может он не правильно разводится?
<TabControl SelectionChanged="TabControl_SelectionChanged"> <TabItem Header="One"/> <TabItem Header="2"/> <TabItem Header="Three"/> </TabControl>
в программном коде ....
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) { int i = 34; }
если я устанавливаю точку останова в строке i = 34, она прерывается ТОЛЬКО, когда я меняю вкладки, даже если на вкладках есть дочерние элементы и один из них выбран.
источник
Если вы используете шаблон MVVM, то неудобно (и нарушает шаблон) использовать обработчик событий. Вместо этого вы можете привязать каждое отдельное
Selector.IsSelected
свойство TabItem к свойству зависимости в вашей модели просмотра, а затем обработать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>
Пример:
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 } }
Если ваш
MainViewModel
,INotifyPropertyChanged
а не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 } }
источник
Этот код вроде работает:
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) { TabItem selectedTab = e.AddedItems[0] as TabItem; // Gets selected tab if (selectedTab.Name == "Tab1") { // Do work Tab1 } else if (selectedTab.Name == "Tab2") { // Do work Tab2 } }
источник
Если кто-то использует WPF Modern UI, они не могут использовать событие OnTabSelected, но могут использовать событие SelectedSourceChanged.
как это
<mui:ModernTab Layout="Tab" SelectedSourceChanged="ModernTab_SelectedSourceChanged" Background="Blue" AllowDrop="True" Name="tabcontroller" >
Код C #
private void ModernTab_SelectedSourceChanged(object sender, SourceEventArgs e) { var links = ((ModernTab)sender).Links; var link = this.tabcontroller.Links.FirstOrDefault(l => l.Source == e.Source); if (link != null) { var index = this.tabcontroller.Links.IndexOf(link); MessageBox.Show(index.ToString()); } }
источник