Есть выбранная вкладка событие изменения в стандартной вкладке элемент управления WPF
в WPF есть событие, которое можно использовать для определения, когда TabControlвыбранная вкладка изменяется?
Я пробовал использовать TabControl.SelectionChanged но он срабатывает много раз, когда выбор ребенка в пределах вкладки изменяется.
9 ответов:
я связал это в обработчике, чтобы заставить его работать:
void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.Source is TabControl) { //do work when tab is changed } }
если вы выберите
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>в codebehind....
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) { int i = 34; }Если я устанавливаю точку останова в строке i = 34, она прерывается только при смене вкладок, даже если вкладки имеют дочерние элементы и один из них выбран.
этот код, кажется, работает:
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 современный пользовательский интерфейс,они не могут использовать событие 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()); } }
если вы используете шаблон MVVM, то неудобно (и нарушает шаблон) использовать обработчик событий. Вместо этого, вы можете привязать каждого tabitem в это
Selector.IsSelectedсвойство к свойству зависимостей в вашем viewmodel, а затем обрабатывать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.cspublic 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.cspublic 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 } }
Comments