104

TabControlWPFで、の選択したタブがいつ変更されるかを判断するために使用できるイベントはありますか?

使ってみTabControl.SelectionChangedましたが、タブ内の子の選択を変更すると何度も解雇されます。

4

9 に答える 9

134

これをハンドラーに結び付けて機能させました:

void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (e.Source is TabControl)
    {
      //do work when tab is changed
    }
}
于 2009-04-21T14:49:47.620 に答える
85

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
}
于 2010-07-01T16:25:34.017 に答える
56

If you just want to have an event when a tab is selected, this is the correct way:

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

And in your code

    private void OnTabSelected(object sender, RoutedEventArgs e)
    {
        var tab = sender as TabItem;
        if (tab != null)
        {
            // this tab is selected!
        }
    }
于 2014-02-27T08:02:55.347 に答える
15

そのイベントは引き続き使用できます。送信者引数が実際に関心のあるコントロールであることを確認し、そうであれば、イベント コードを実行します。

于 2009-04-21T14:39:40.890 に答える
4

生成されたイベントは、処理されるまでバブリングしています。

以下のこのxaml部分は、の変更に関係なく、で選択されたアイテムが変更された後にトリガー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;
}
于 2009-12-12T14:39:54.800 に答える
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;
}

i = 34行にブレークポイントを設定すると、タブに子要素があり、そのうちの1つが選択されている場合でも、タブを変更したときにのみ壊れます。

于 2009-04-21T14:45:28.363 に答える
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
        }
    }
于 2011-12-05T14:15:52.943 に答える
-1

WPF モダン UI を使用している場合、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());
          }            
    }
于 2014-05-09T07:08:29.600 に答える