স্ট্যান্ডার্ড ডাব্লুপিএফ ট্যাব নিয়ন্ত্রণে নির্বাচিত ট্যাব পরিবর্তিত ইভেন্ট রয়েছে কি?


98

ডাব্লুপিএফ-তে, এমন কোনও ইভেন্ট রয়েছে যা কোনও TabControlনির্বাচিত ট্যাব কখন পরিবর্তন হবে তা নির্ধারণ করতে ব্যবহার করা যেতে পারে ?

আমি চেষ্টা করার চেষ্টা করেছি TabControl.SelectionChangedকিন্তু যখন ট্যাবটির মধ্যে বাচ্চার নির্বাচন পরিবর্তন করা হয় তখন এটি অনেক বার নষ্ট হয়ে যায়।

উত্তর:


123

এটিকে কাজ করতে আমি এটি হ্যান্ডলারের সাথে বেঁধেছি:

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

4
আমি ভেবেছিলাম এটি কাজ করছে না তবে আমি বুঝতে পেরেছিলাম যে এর senderপরিবর্তে আমি সন্ধান করছিe.Source
গিলারমো রুফিনো

4
বা e.Handled = trueএটিকে বুদ্বুদ করা থেকে বিরত রাখতে কেবল যুক্ত করুন
ব্রুক হেনসলে

80

আপনি যদি 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
}

51

আপনি যদি কোনও ট্যাব নির্বাচন করা হয় কেবল তখনই কোনও ইভেন্ট রাখতে চান, এটি সঠিক উপায়:

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

দুর্ভাগ্যক্রমে এই দেখতে যতটা সুন্দর, আমি সিলেক্টেড সম্পত্তি আমার কাছে এক্সএএমএলে উপলব্ধ করব না, কেবল ইসসলেক্টেড। দুঃখিত
ফেনারী 21

আমি সংশোধন .... ধরণের। ডিওএইচ! আমি যখন উপরের দিকে ভিএস-তে টাইপ করার চেষ্টা করি তখন এটি আমাকে লাল স্কুইগ্লিগুলি দেয়, তাই আমি ভেবেছিলাম এটি ভুল ছিল। কিন্তু যখন আমি এটি কেটে ফেললাম এবং অন্ধভাবে এফ 5 করছিলাম তখন আমার আশ্চর্য হয়ে গেল, এটি কাজ করেছিল। হুঁ ?! কেন এটি সেভাবে কাজ করল?
ফেনারি

আমি কীভাবে xaml এর পরিবর্তে কোডে "নির্বাচক.নির্বাচিত" ইভেন্ট অ্যাক্সেস করতে পারি
আহমেদ_ফারাজ

15

আপনি এখনও এই ইভেন্টটি ব্যবহার করতে পারেন। কেবলমাত্র পরীক্ষা করুন যে প্রেরকের যুক্তিটি হ'ল আপনি যে নিয়ন্ত্রণটি করছেন তা আসলে এবং যদি তাই হয় তবে ইভেন্ট কোডটি চালান।


4

উত্পন্ন ইভেন্টটি পরিচালনা না হওয়া অবধি বুদবুদ হয়ে যাচ্ছে।

নীচে এই এক্সএএমএল অংশটি যখন আইটেমটি পরিবর্তনগুলিতে নির্বাচন না করে পরিবর্তিত হয় তার ui_Tab_Changedপরে ট্রিগার করে ।ui_A_ChangedListViewTabItemTabControl

<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

এটাই সঠিক ঘটনা। সম্ভবত এটি সঠিকভাবে বিরক্ত হয়নি?

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

যদি আমি আই = 34 লাইনে একটি ব্রেকপয়েন্ট সেট করি তবে ট্যাবগুলিতে শিশুদের উপাদান থাকে এবং তার মধ্যে একটি নির্বাচন করা থাকলেও আমি কেবল ট্যাবগুলি পরিবর্তন করলেই এটি বিরতি হয়।


ট্যাবটিতে একটি গ্রিড রাখুন, একটি গ্রিড সারি নির্বাচন করা ট্যাব নির্বাচিত ইভেন্টটিতে উপস্থিত হওয়ার আগে হ্যান্ডেল না করা হলে বুদবুদ হবে up
পল সুইটজ

3

আপনি যদি এমভিভিএম প্যাটার্নটি ব্যবহার করছেন তবে ইভেন্ট হ্যান্ডলারটি ব্যবহার করা অসুবিধাজনক (এবং প্যাটার্নটি ভেঙে)। পরিবর্তে, আপনি প্রতিটি ভিউ মডেলের Selector.IsSelectedকোনও নির্ভরশীল সম্পত্তিতে প্রতিটি স্বতন্ত্র ট্যাবআইটেমের সম্পত্তি আবদ্ধ করতে পারেন এবং তারপরে 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

এই কোডটি কাজ করছে বলে মনে হচ্ছে:

    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

যদি কেউ ডাব্লুপিএফ মডার্ন ইউআই ব্যবহার করে তবে তারা অনট্যাবসিলিগ্রেড ইভেন্টটি ব্যবহার করতে পারবেন না ut তবে তারা সিলেক্টসোর্স চেঞ্জড ইভেন্টটি ব্যবহার করতে পারবেন।

এটার মত

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

সি # কোডটি

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

4
তৃতীয় পক্ষের যুক্তি ব্যবহার করা কখনই কোনও সমাধান নয় এবং এটি অত্যন্ত নিরুৎসাহিত করা উচিত।
স্টিভেন বোর্জেস

@ স্টেভেন আমি ডাব্লুপিএফ এমইউআইয়ের জন্য এটি লিখেছিলাম এবং এটি প্রশ্নেরও উত্তর নয় ut তবে এটি ডাব্লুপিএফ মুই ইউজার হতে পারে hat এই কারণেই আমি এটিকে একটি উত্তর হিসাবে রেখেছি। আপনাকে ধন্যবাদ
সানদুন হর্ষা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.