1

我试图只让 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 的标题来触发事件 - 有什么想法吗?

4

5 回答 5

2

您可以通过使用 HeaderTemplate 获得所需的行为,如下所示(这是非常基本的,因此您需要对其进行修复以理清标签的高度......等等)。只需用此设置器替换您当前的事件设置器:

<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>
于 2010-07-01T11:11:18.160 回答
2

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
                }
        }
于 2013-11-22T18:36:41.373 回答
2

您所看到的是 WPF 冒泡事件模型的效果,即发生在子代中的事件通常会冒泡到父代。

您可能需要做的是检查Source,或者可能是 MouseButtonEventArgs 的OriginalSource属性,并且只响应来自 TabItem 类型的事件。

要尝试的另一件事是检查IsMouseDirectlyOver属性,如果鼠标在父元素的边界内,但实际上是在子元素上方,则该属性应返回 false。

您可以尝试在选项卡项中的 TextBox 上设置IsHitTestVisible,但您可能会发现这会产生不良副作用,例如单击文本时不会更改所选选项卡。

于 2010-07-01T10:26:00.577 回答
1

我有与原始问题相同的需求,但出于一个原因和另一个原因,我不想深入研究 XAML 以使其正常工作......所以这个快速'n'dirty 纯代码解决方案对我来说效果很好:

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 ...
    // ...
}
于 2011-11-30T07:04:10.810 回答
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>
于 2010-07-01T13:47:55.693 回答