在我的应用程序中,我使用WPF TabControl
我想处理TabItem
的单击事件。 我如何实现它?如何处理WPF中的TabItem单击事件?
回答
将标题封装在无模板按钮中。
如果您使用的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>
您可以通过添加标签,这样做到tabcontrol中每个tabitem的header属性。然后你可以为标签设置一个事件。
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#/代码背后
private void tabItem1_Clicked(object sender, MouseButtonEventArgs e)
{
//DO SOMETHING
}
private void tabItem2_Clicked(object sender, MouseButtonEventArgs e)
{
//DO SOMETHING
}
希望这有助于。
这是一个古老的问题,但我在相同的情况下找到答案。
我用的TabControl的(XAML)SelectionChanged事件
<TabControl SelectionChanged="TabControl_SelectionChanged">
后面的代码(C#):
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
//Stuff
}
这不是点击自己,而是其令人耳目一新的东西的工作..
这种类型的解决方案给了我一个问题,因为只要tabcontrol中的控件改变选择,它就会触发,而不仅仅是tabcontrol本身的选择。 – 2015-07-14 22:30:14
尝试使用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
}
希望这将是有益的
可以在TabControl的使用SelectionChanged事件,并使用开关的情况下做任何你喜欢的。
// XAML代码
<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;
}
}
您可以通过添加标签的标题属性在TabControl的每个 TabItem的做到这一点。然后你可以为标签设置一个事件。
该解决方案工作得很好;但是,“标签”具有边距属性,可以防止“MouseLeftButtonDown”处理程序被触发,除非用户单击标签时不起作用。此外,由于标签填充,看起来其他选项卡的样式会受到影响。
您可以通过覆盖标签的默认边距/填充属性来缓解这种情况......或者甚至更简单地使用TextBlock。
<TabItem x:Name="tabItem1" >
<TabItem.Header>
<TextBlock MouseLeftButtonDown="tabItem1_Click">
Click Me
</TextBlock>
</TabItem.Header>
...
</TabItem>
如果我们还要设置标签的* Content *属性,我们是否需要设置标签的*名称*? – 2015-01-01 21:18:38
不,不需要TabItem的名称。只要Label具有关联的单击事件处理程序,它就可以工作。 – 2015-01-01 23:20:29