Standart WPF Sekme Denetiminde Seçili Sekme Değiştirilmiş Olay var mı


99

WPF'de, bir TabControlseçili sekmenin ne zaman değiştiğini belirlemek için kullanılabilecek bir olay var mı?

Kullanmayı denedim TabControl.SelectionChangedama bir çocuğun sekme içindeki seçimi değiştirildiğinde defalarca ateşleniyor.

Yanıtlar:


126

Çalışması için bunu işleyiciye bağladım:

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

2
Bunun işe yaramadığını düşündüm ama senderyerine kontrol ettiğimi fark ettime.Source
Guillermo Ruffino

4
veya sadece e.Handled = trueköpürmesini önlemek için ekleyin
Brock Hensley

81

x:NameHer birine özelliği şu şekilde ayarlarsanız 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>

Daha sonra TabItemetkinlikteki her birine erişebilirsiniz :

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
}

51

Yalnızca bir sekme seçildiğinde bir etkinlik olmasını istiyorsanız, bu doğru yoldur:

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

Ve kodunuzda

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

Ne yazık ki bu göründüğü kadar güzel, xaml'de kullanabileceğim Seçili mülkü alamıyorum, sadece IsSelected. Afedersiniz.
PHenry

Düzeltilmiş durumdayım .... tür. DOH! Yukarıdakileri VS'de yazmaya çalıştığımda, bana kırmızı dalgalı çizgiler veriyor, bu yüzden yanlış olduğunu düşündüm. AMA onu kestim ve körü körüne F5'lediğimde, şaşkınlıkla, İŞE YARADI. HUH ?! Neden bu şekilde çalıştı?
PHenry

1
Xaml yerine koddaki "Selector.Selected" olayına nasıl erişebilirim
Ahmed_Faraz

15

Hala o olayı kullanabilirsin. Gönderen bağımsız değişkeninin gerçekten ilgilendiğiniz denetim olup olmadığını kontrol edin ve öyleyse olay kodunu çalıştırın.


4

Oluşturulan olay, işlenene kadar köpürüyor.

Tetikleyiciler aşağıda Bu xaml kısmı ui_Tab_Changedsonra ui_A_Changedöğesi seçili iken ListViewolursa olsun, değişiklikleri TabItemdeğişim TabControl.

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

Olayı ui_A_Changed( ui_B_Changedve vb.) Tüketmemiz gerekiyor :

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

3

Doğru olay budur. Belki doğru bağlanmamış?

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

kod arkasında ....

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

i = 34 satırında bir kesme noktası ayarlarsam, SADECE sekmeleri değiştirdiğimde, sekmelerde alt öğeler olsa ve bunlardan biri seçilse bile kırılır.


sekmeye bir ızgara yerleştirin, bir ızgara satırı seçmek, oraya ulaşmadan önce işlenmezse sekme seçilen etkinliğe kadar kabarır.
Paul Swetz

3

MVVM modelini kullanıyorsanız, olay işleyicisini kullanmak zahmetlidir (ve deseni bozar). Bunun yerine, her bir TabItem Selector.IsSelectedözelliğini görünüm modelinizdeki bir bağımlılık özelliğine bağlayabilir ve ardından PropertyChangedolay işleyicisini işleyebilirsiniz . Bu şekilde, tam olarak hangi sekmenin seçildiğini / seçiminin kaldırıldığını bilirsiniz PropertyNameve her sekme için özel bir işleyiciniz olur.

Misal: MainView.xaml

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

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

Eğer senin MainViewModelolduğunu INotifyPropertyChangedziyade DependencyObject, o zaman bu yerine kullanın:

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

2

Bu kod çalışıyor gibi görünüyor:

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

-1

WPF Modern UI kullananlar, OnTabSelected olayını kullanamazlar, ancak SelectedSourceChanged olayını kullanabilirler.

bunun gibi

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

C # kodu

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

3
Üçüncü taraf argümanlarını kullanmak asla bir çözüm değildir ve kesinlikle önerilmez.
Steven Borges

@steven bunu WPF MUI için yazdım ve bu da sorunun cevabı değil. ama bu cevap wpf mui kullanıcısı olabilir, bu yüzden bunu cevap olarak koydum. teşekkür ederim
Sandun Harshana
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.