[wpf] 표준 WPF 탭 컨트롤에 선택한 탭 변경 이벤트가 있습니까?

WPF에서 TabControl의 선택한 탭이 변경 되는시기를 확인하는 데 사용할 수있는 이벤트가 있습니까?

나는 사용을 시도 TabControl.SelectionChanged했지만 탭 내에서 자녀의 선택이 변경되면 여러 번 해고됩니다.



답변

나는 그것을 작동시키기 위해 핸들러에 묶었 다.

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


답변

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
}


답변

탭이 선택되었을 때 이벤트를 갖고 싶다면 다음과 같은 올바른 방법입니다.

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


답변

해당 이벤트를 계속 사용할 수 있습니다. sender 인수가 실제로 관심있는 컨트롤인지 확인하고 그렇다면 이벤트 코드를 실행하십시오.


답변

생성 된 이벤트는 처리 될 때까지 버블 링됩니다.

이 트리거 아래 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;
}


답변

그것은 올바른 사건입니다. 제대로 연결되지 않았을까요?

<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 행에 중단 점을 설정하면 탭에 자식 요소가 있고 그중 하나가 선택되어 있어도 탭을 변경할 때만 중단됩니다.


답변

이 코드는 작동하는 것 같습니다.

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