Как выполнить действие при выборе вкладки из tabcontrol? [Дубликат]

more_itertools.locate находит индексы для всех элементов, удовлетворяющих условию.

from more_itertools import locate


list(locate([0, 1, 1, 0, 1, 0, 0]))
# [1, 2, 4]

list(locate(['a', 'b', 'c', 'b'], lambda x: x == 'b'))
# [1, 3]

more_itertools является сторонней библиотекой > pip install more_itertools.

80
задан skeletank 5 February 2013 в 21:38
поделиться

9 ответов

Я связал это в обработчике, чтобы он работал:

void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (e.Source is TabControl)
    {
      //do work when tab is changed
    }
}
109
ответ дан Jon Kragh 17 August 2018 в 14:25
поделиться
  • 1
    Я думал, что это не работает, но потом я понял, что проверяю sender вместо e.Source – Guillermo Ruffino 30 April 2013 в 20:46
  • 2
    или просто добавьте e.Handled = true, чтобы предотвратить его всплытие – Brock Hensley 4 September 2013 в 13:43

Если вы устанавливаете свойство 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
}
66
ответ дан Elmo 17 August 2018 в 14:25
поделиться

Этот код работает:

    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
        }
    }
2
ответ дан Mc_Topaz 17 August 2018 в 14:25
поделиться

Если вы хотите просто иметь событие, когда выбрана вкладка, это правильный путь:

<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!
        }
    }
34
ответ дан MicBig 17 August 2018 в 14:25
поделиться
  • 1
    К сожалению, так приятно, как этот выглядит, я не получаю свойство Selected, доступное мне в xaml, просто IsSelected. Сожалею. – PHenry 28 March 2014 в 23:05
  • 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
ответ дан Muad'Dib 17 August 2018 в 14:25
поделиться
  • 1
    поместите сетку во вкладку, выбор строки сетки будет пузыриться до выбранного события вкладки, если он не обрабатывается до того, как он туда попадет. – Paul Swetz 23 March 2018 в 15:10

Вы все равно можете использовать это событие. Просто проверьте, что аргумент отправителя - это тот элемент, который вам действительно нужен, и если да, запустите код события.

14
ответ дан Nidonocu 17 August 2018 в 14:25
поделиться

Если вы используете шаблон 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
 }
}
0
ответ дан Nikola Novak 17 August 2018 в 14:25
поделиться

Генерированное событие пузырится до тех пор, пока оно не будет обработано.

Эта часть 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_Changedui_B_Changed и т. д.):

private void ui_A_Changed(object sender, SelectionChangedEventArgs e) {
  // do what you need to do
  ...
  // then consume the event
  e.Handled = true;
}
4
ответ дан rolling 17 August 2018 в 14:25
поделиться

Если кто-либо использует WPF Modern UI, они не могут использовать OnTabSelected event.but, они могут использовать событие 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());
          }            
    }
0
ответ дан Sandun Harshana 17 August 2018 в 14:25
поделиться
  • 1
    Использование сторонних аргументов никогда не является решением и должно быть сильно обескуражено. – Steven Borges 25 August 2016 в 11:42
  • 2
    @steven Я написал это для WPF MUI, и это не ответ на вопрос too.but, это может быть ответ wpf mui user.Это почему я положил это в качестве ответа. Спасибо – Sandun Harshana 30 December 2016 в 04:53
Другие вопросы по тегам:

Похожие вопросы: