如何只使tabitem的标题响应鼠标事件

时间:2010-07-01 10:14:59

标签: wpf header tabcontrol tabitem

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

5 个答案:

答案 0 :(得分:2)

你所看到的是WPF冒泡事件模型的影响,即儿童中发生的事件通常会冒泡到父母身上。

您可能需要做的是检查MouseButtonEventArgs的SourceOriginalSource属性,并仅响应来自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>