#c# #wpf
#c# #wpf
Вопрос:
В моем приложении я использовал WPF TabControl
Я хочу обработать событие щелчка TabItem
. Как мне этого добиться?
Ответ №1:
Вы можете сделать это, добавив метки в свойство header для каждого tabitem в tabcontrol. Затем вы можете установить событие для метки.
xaml
<TabControl Height="100" HorizontalAlignment="Left" Name="tabControl1">
<TabItem Name="tabItem1">
<TabItem.Header>
<Label Content="tabItem1"
MouseLeftButtonDown="tabItem1_Clicked"
HorizontalAlignment="Stretch"/>
</TabItem.Header>
<Grid />
</TabItem>
<TabItem Name="tabItem2">
<TabItem.Header>
<Label Content="tabItem2"
MouseLeftButtonDown="tabItem2_Clicked"
HorizontalAlignment="Stretch"/>
</TabItem.Header>
<Grid />
</TabItem>
</TabControl>
C # / Code Behind
private void tabItem1_Clicked(object sender, MouseButtonEventArgs e)
{
//DO SOMETHING
}
private void tabItem2_Clicked(object sender, MouseButtonEventArgs e)
{
//DO SOMETHING
}
Надеюсь, это поможет.
Комментарии:
1. Нужно ли нам задавать название вкладки, если мы также устанавливаем свойство Content метки?
2. Нет, имя TabItem не требуется. Пока Label имеет связанный обработчик события щелчка, он будет работать.
3. Отличное решение. Спасибо
Ответ №2:
Это старый вопрос, но я нахожу ответ, побывав в такой же ситуации.
Я использую событие SelectionChanged в TabControl (XAML)
<TabControl SelectionChanged="TabControl_SelectionChanged">
Код, лежащий в основе (C #):
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
//Stuff
}
Это не сам щелчок, но он работает для обновления материала..
Комментарии:
1. Этот тип решения вызвал у меня проблему, потому что, казалось, он срабатывал всякий раз, когда элементы управления в tabcontrol меняли выбор, а не только выбор самого tabcontrol.
Ответ №3:
Вы можете использовать событие SelectionChanged в TabControl и использовать switch case, чтобы делать все, что вам нравится.
// XAML Code
<TabControl SelectionChanged="TabControl_SelectionChanged">
<TabItem Header="Item1"></TabItem>
<TabItem Header="Item2"></TabItem>
<TabItem Header="Item3"></TabItem>
</TabControl>
// За кодом
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
string tabItem = ((sender as TabControl).SelectedItem as TabItem).Header as string;
switch(tabItem)
{
case "Item1":
break;
case "Item2":
break;
case "Item3":
break;
default:
return;
}
}
Ответ №4:
Обратите внимание, что, хотя ответ, предоставленный Д.монкадой и другими, касается вопроса, сам вопрос может быть не тем, что задумано. Знание того, когда пользователь нажимает на вкладку, отличается от знания того, когда пользователь делает вкладку самой передней — это можно сделать, нажав на вкладку, но этого также можно достичь другими средствами. Например, если щелкнуть на вкладке, которая уже находится впереди, а затем использовать стрелки влево / вправо, вы можете вывести другую вкладку вперед без щелчка мышью — событие нажатия левой кнопки мыши в этом случае не вызывается (как и следовало ожидать).
Ответ №5:
Оберните заголовок кнопкой без шаблона.
Если вы используете ItemsSource:
<TabControl ItemsSource="{Binding Data}">
<TabControl.ItemTemplate>
<DataTemplate>
<Button Click="Tab_Click">
<Button.Template>
<ControlTemplate>
<ContentPresenter />
</ControlTemplate>
</Button.Template>
<Button.Content>
<!-- Actual header goes here -->
</Button.Content>
</Button>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
Если у вас есть статическое содержимое, вы можете сразу вставить его в заголовок:
<TabControl>
<TabItem>
<TabItem.Header>
<Button Click="Tab_Click">
<Button.Template>
<ControlTemplate>
<ContentPresenter />
</ControlTemplate>
</Button.Template>
<Button.Content>
<!-- Actual header goes here -->
</Button.Content>
</Button>
</TabItem.Header>
</TabItem>
</TabControl>
Ответ №6:
Вы можете сделать это, добавив метки в свойство header для каждого tabitem в tabcontrol. Затем вы можете установить событие для метки.
Решение работает довольно хорошо; однако «label» имеет свойства margin, которые могут предотвратить запуск обработчика «MouseLeftButtonDown», если пользователь не нажмет на метку намертво. Кроме того, похоже, что стиль для остальных вкладок изменен из-за заполнения меток.
Вы могли бы облегчить это, переопределив свойства метки по умолчанию margin / padding … или даже проще, используя TextBlock.
<TabItem x:Name="tabItem1" >
<TabItem.Header>
<TextBlock MouseLeftButtonDown="tabItem1_Click">
Click Me
</TextBlock>
</TabItem.Header>
...
</TabItem>
Ответ №7:
попробуйте найти решение с GotFocus
событием.
private void addTabPage_GotFocus(object sender, RoutedEventArgs e)
{
addTabPage(); //method for adding page
TabControlPages.SelectedIndex = TabControlPages.Items.Count - 1; //select added page
TabControlPages.Focus(); //change forcus to selected page
}
также способ добавления страницы (просто пример)
private void addTabPage()
{
TabItem tc = new TabItem();
tc.Header = "New page";
TabControlPages.Items.Insert(TabControlPages.Items.Count - 1, tc); //insert new page
}
надеюсь, это будет полезно