【发布时间】:2011-04-20 08:07:01
【问题描述】:
在我的应用程序中,我使用了 WPF TabControl 我想处理 TabItem 的点击事件。
如何实现?
【问题讨论】:
在我的应用程序中,我使用了 WPF TabControl 我想处理 TabItem 的点击事件。
如何实现?
【问题讨论】:
您可以通过为 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
}
这不是点击 HimSelf,而是用来提神。
【讨论】:
您可以在 TabControl 中使用 SelectionChanged 事件,并使用 switch case 来做任何您喜欢的事情。
// 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;
}
}
【讨论】:
请注意,尽管 d.moncada 和其他人提供的答案解决了这个问题,但问题本身可能不是预期的。知道用户何时单击选项卡与知道用户何时将选项卡放在最前面是不同的——这可以通过单击选项卡来完成,但也可以通过其他方式实现。例如,如果您单击已经位于最前面的选项卡,然后使用左/右箭头,您可以在不单击鼠标的情况下将另一个选项卡带到前面 - 在这种情况下不会调用 mouse-left-button-down 事件(如您所料)。
【讨论】:
将标题包装在无模板按钮中。
如果您使用 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>
【讨论】:
您可以通过为每个标题属性添加标签来做到这一点 选项卡控件中的 tabitem。然后你可以为标签设置一个事件。
解决方案效果很好;但是,“标签”具有边距属性,可以防止“MouseLeftButtonDown”处理程序被触发,除非用户单击该标签。此外,由于标签填充,其余选项卡的样式似乎受到了影响。
您可以通过覆盖标签的默认边距/填充属性来缓解这种情况......或者更简单,使用 TextBlock。
<TabItem x:Name="tabItem1" >
<TabItem.Header>
<TextBlock MouseLeftButtonDown="tabItem1_Click">
Click Me
</TextBlock>
</TabItem.Header>
...
</TabItem>
【讨论】:
尝试通过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
}
希望这会有所帮助
【讨论】: