supported not control wpf events tabcontrol

not - ¿Hay un evento de ficha cambiada seleccionada en el control de ficha WPF estándar?



add windows control to wpf (9)

Aún puedes usar ese evento. Simplemente verifique que el argumento del remitente sea el control que realmente le importa y, de ser así, ejecute el código del evento.

En WPF, ¿hay algún evento que pueda usarse para determinar cuándo cambia la pestaña seleccionada de TabControl ?

He intentado usar TabControl.SelectionChanged pero se dispara varias veces cuando se cambia la selección de un niño dentro de una pestaña.


Até esto en el controlador para que funcione:

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


El evento generado burbujea hasta que se maneja.

Esta porción xaml a continuación activa ui_Tab_Changed después de ui_A_Changed cuando el elemento seleccionado en el ListView cambia, independientemente del cambio de TabItem en el TabControl .

<TabControl SelectionChanged="ui_Tab_Changed"> <TabItem> <ListView SelectionChanged="ui_A_Changed" /> </TabItem> <TabItem> <ListView SelectionChanged="ui_B_Changed" /> </TabItem> </TabControl>

Necesitamos consumir el evento en ui_A_Changed (y ui_B_Changed , y así sucesivamente):

private void ui_A_Changed(object sender, SelectionChangedEventArgs e) { // do what you need to do ... // then consume the event e.Handled = true; }


Ese es el evento correcto. Tal vez no está conectado correctamente?

<TabControl SelectionChanged="TabControl_SelectionChanged"> <TabItem Header="One"/> <TabItem Header="2"/> <TabItem Header="Three"/> </TabControl>

en el código detrás ...

private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) { int i = 34; }

si establezco un punto de interrupción en la línea i = 34, SOLO se rompe cuando cambio las pestañas, incluso cuando las pestañas tienen elementos secundarios y uno de ellos está seleccionado.


Este código parece funcionar:

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 } }


Si alguien usa WPF Modern UI, no pueden usar el evento OnTabSelected, pero pueden usar el evento SelectedSourceChanged.

Me gusta esto

<mui:ModernTab Layout="Tab" SelectedSourceChanged="ModernTab_SelectedSourceChanged" Background="Blue" AllowDrop="True" Name="tabcontroller" >

El código C # es

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()); } }


Si está utilizando el patrón MVVM, entonces es inconveniente (y rompe el patrón) utilizar el controlador de eventos. En su lugar, puede vincular la propiedad Selector.IsSelected cada TabItem individual a una propiedad de dependencia en su viewmodel y luego manejar el controlador de eventos PropertyChanged . De esta forma, sabrá exactamente qué pestaña fue seleccionada / deseleccionada en función de PropertyName y tendrá un controlador especial para cada pestaña.

Ejemplo: MainView.xaml

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

Ejemplo: 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 } }

Si su MainViewModel es INotifyPropertyChanged lugar de DependencyObject , entonces use esto en su lugar:

Ejemplo: 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 } }


Si establece la propiedad x:Name en cada TabItem como:

<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>

Luego puede acceder a cada TabItem en el evento:

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 }


Si solo desea tener un evento cuando se selecciona una pestaña, esta es la forma correcta:

<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>

Y en tu código

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