क्या मानक WPF टैब नियंत्रण में चयनित टैब बदला हुआ ईवेंट है


96

WPF में, क्या कोई ऐसी घटना है जिसका उपयोग यह निर्धारित करने के लिए किया जा सकता है कि TabControlटैब का चयन कब बदलता है?

मैंने उपयोग करने की कोशिश की है TabControl.SelectionChangedलेकिन कई बार निकाल दिया जाता है जब एक टैब के भीतर बच्चे का चयन बदल जाता है।

जवाबों:


122

मैंने इसे काम करने के लिए हैंडलर में बांधा:

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

2
मैंने सोचा था कि यह काम नहीं कर रहा था, लेकिन तब मुझे एहसास हुआ कि मैं senderइसके बजाय की जाँच कर रहा थाe.Source
गिलर्मो रफ़िनो

4
या बस e.Handled = trueइसे बुदबुदाती से रोकने के लिए जोड़ें
ब्रॉक हेंसले

77

यदि आप 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
}

50

यदि आप टैब के चयन के समय कोई घटना चाहते हैं, तो यह सही तरीका है:

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

दुर्भाग्य से यह जितना अच्छा लगता है, मुझे चयनित संपत्ति ज़म्ल में उपलब्ध नहीं है, बस इस्लेक्टेड है। माफ़ करना।
फेन्री

मैं सही किया .... तरह। DOH! जब मैं वीएस में उपरोक्त के बारे में टाइप करने की कोशिश करता हूं, तो यह मुझे लाल स्क्विग्लिस देता है, इसलिए मैंने सोचा कि यह गलत था। लेकिन जब मैंने इसे काट लिया और इसे आँख मूंद कर F5'd कर दिया, तो यह मेरे आश्चर्य की बात है, यह काम किया। हुह ?! यह इस तरह से काम क्यों किया?
फेन्री

मैं xaml के बजाय कोड में "Selector.Selected" घटना का उपयोग कैसे कर सकता हूं
अहमद_फराज

15

आप अभी भी उस घटना का उपयोग कर सकते हैं। बस जांचें कि प्रेषक तर्क वह नियंत्रण है जिसके बारे में आप वास्तव में परवाह करते हैं और यदि ऐसा है, तो ईवेंट कोड चलाएं।


4

उत्पन्न घटना तब तक बुदबुदाती है जब तक इसे संभाला नहीं जाता।

नीचे 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;
}

3

यदि आप 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.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
 }
}

यह मेरे लिए काम करता है;)
ब्लड-हैज़र्ड

2

यह सही घटना है। शायद यह सही ढंग से वायर्ड नहीं है?

<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 लाइन पर एक ब्रेकपॉइंट सेट करता हूं, तो यह तब ही टूटता है जब मैं टैब बदल देता हूं, तब भी जब टैब में बाल तत्व होते हैं और उनमें से एक का चयन किया जाता है।


टैब में एक ग्रिड डालें, ग्रिड पंक्ति का चयन टैब चयनित घटना तक हो जाएगा यदि वहां पहुंचने से पहले इसे संभाला नहीं गया।
पॉल स्वेटज़

2

यह कोड काम करने लगता है:

    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 आधुनिक UI का उपयोग करता है, तो वे OnTabSelected event.but का उपयोग नहीं कर सकते हैं, वे SelectSourceChanged ईवेंट का उपयोग कर सकते हैं।

इस तरह

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

3
तीसरे पक्ष के तर्कों का उपयोग करना कभी भी समाधान नहीं होता है और इसे अत्यधिक हतोत्साहित किया जाना चाहिए।
स्टीवन बोर्गेस

@ जल्द ही मैंने इसे WPF MUI के लिए लिखा है और यह भी सवाल का जवाब नहीं है। लेकिन इसका जवाब wpf mui user हो सकता है। यही कारण है कि मैंने इसे एक जवाब के रूप में रखा है। धन्यवाद
Sandun Harshana
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.