Как заставить только заголовок tabitem реагировать на событие мыши - PullRequest
0 голосов
/ 01 июля 2010

Я пытаюсь сделать так, чтобы только заголовок 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 ]

2 голосов
/ 01 июля 2010

Вы можете получить желаемое поведение, используя шаблон 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>
2 голосов
/ 01 июля 2010

То, что вы видите, - это эффект пузырьковой модели событий WPF, согласно которой события, которые происходят в дочерних элементах, обычно всплывают до родительского.

Что вам, вероятно, нужно будет сделать, это проверить Source или, возможно, OriginalSource свойства MouseButtonEventArgs и реагировать только на события, поступающие из типов TabItem.

Еще одна попытка - проверить свойство IsMouseDirectlyOver , которое должно возвращать false, если мышь находится внутри границ родительского элемента, но на самом деле находится над дочерним элементом.

Вы можете попробовать установить IsHitTestVisible , скажем, на TextBox в элементе вкладки, но вы, вероятно, обнаружите, что это имеет нежелательные побочные эффекты, такие как не изменение выбранной вкладки при нажатии на текст.

1 голос
/ 22 ноября 2013

Событие 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
                }
        }
1 голос
/ 30 ноября 2011

У меня такая же потребность, как и в исходном вопросе, но по одной и другой причине я не хочу углубляться в 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 ...
    // ...
}
0 голосов
/ 01 июля 2010

Для других, последний xaml для получения заголовка tabItems, отправляющего только событие, будет ...

    <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>
...