programing

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

skycolor 2023. 5. 12. 21:56
반응형

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

WPF에서, 언제인지 결정하는 데 사용할 수 있는 이벤트가 있습니까?TabControl의 선택한 탭을 변경하시겠습니까?

사용해 보았습니다.TabControl.SelectionChanged하지만 탭 내에서 아이의 선택이 변경되면 여러 번 해고됩니다.

가장 바깥쪽을 분리하려면 이벤트 소스를 확인해야 합니다.TabControl당신은 찾고 있습니다.

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

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 인수가 실제로 중요한 컨트롤인지 확인하고, 그렇다면 이벤트 코드를 실행합니다.

MVVM 패턴을 사용하는 경우 이벤트 핸들러를 사용하는 것이 불편합니다(패턴이 깨집니다).대신 각 개별 TabItem을 바인딩할 수 있습니다.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
 }
}

생성된 이벤트는 처리될 때까지 거품이 발생합니다.

트리거 아래의 이 샘플 부분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
        }
    }

WPF Modern UI를 사용하는 사용자는 OnTab Selected 이벤트를 사용할 수 없습니다.그러나 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());
          }            
    }

언급URL : https://stackoverflow.com/questions/772841/is-there-selected-tab-changed-event-in-the-standard-wpf-tab-control

반응형