我试图只让TabItem的标题发送一个事件。
到目前为止,我有我的xaml ......
<TabControl>
<TabItem Header="tab 1">
Any text
</TabItem>
<TabItem Header="tab 2">
<TextBox>blah</TextBox>
</TabItem>
<TabControl.Resources>
<Style TargetType="TabItem">
<EventSetter Event="MouseDoubleClick" Handler="TabItemMouseDoubleClick"/>
</Style>
</TabControl.Resources>
</TabControl>
...和我的事件处理程序......
void TabItemMouseDoubleClick(object sender, MouseButtonEventArgs e)
{}
现在,当双击标签项标题时,事件将触发,当单击标签项内容区域时它不会触发(这就是我想要的),但是当我在TabItem中放置一个文本框时,事件将触发双击文本框。我试图只获取TabItem的标题来触发事件 - 任何想法?
答案 0 :(得分:2)
你所看到的是WPF冒泡事件模型的影响,即儿童中发生的事件通常会冒泡到父母身上。
您可能需要做的是检查MouseButtonEventArgs的Source或OriginalSource属性,并仅响应来自TabItem类型的事件。
要尝试的另一件事是检查IsMouseDirectlyOver属性,如果鼠标位于父级的边界内,则该属性应返回false,但实际上是在子元素上。
您可以尝试在标签项中设置IsHitTestVisible,例如,TextBox,但您可能会发现它有不良副作用,例如在您单击文本时不更改所选标签。
答案 1 :(得分:2)
你可以通过如下方式使用HeaderTemplate来获得你想要的行为(这是非常基本的,所以你需要修复它来整理标签的高度......等等)。只需使用此setter替换当前的事件设置器:
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<Label Content={Binding}>
<Label.Style>
<Style TargetType="Label">
<EventSetter Event="MouseDoubleClick" Handler="TabItemMouseDoubleClick"/>
</Style>
</Label.Style>
</Label>
</DataTemplate>
</Setter.Value>
</Setter>
答案 2 :(得分:1)
我有与原始问题相同的需求,但出于某种原因,我不想深入研究XAML以使其正常工作......所以这个快速的仅限代码的解决方案对我来说效果很好:
void TabItemMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
Point point = e.GetPosition(tabItem);
if (point.Y > 32)
{
// Click was below the tab header
// Note: 32 refers to the height of the tab header in pixels.
return;
}
// handle the double-click on the header here ...
// ...
}
答案 3 :(得分:1)
TabItem MouseDoubleClick事件:
private void TabOnMouseDoubleClick(object sender, MouseButtonEventArgs mouseButtonEventArgs)
{
var tabItem = (sender as TabItem);
var mo = (tabItem.Content as UIElement).IsMouseOver;
if (!mo)
{
//Here you know you are working with header
}
}
答案 4 :(得分:0)
对于其他人来说,获取tabItems标题只发送事件的最终xaml是......
<TabControl>
<TabItem Header="tab 1">
Any text
</TabItem>
<TabItem Header="tab 2">
<TextBox>blah</TextBox>
</TabItem>
<TabControl.Resources>
<Style TargetType="TabItem">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<Label Content="{Binding}">
<Label.Style>
<Style TargetType="Label">
<EventSetter Event="MouseDoubleClick" Handler="TabItemMouseDoubleClick"/>
</Style>
</Label.Style>
</Label>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</TabControl.Resources>
</TabControl>