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

表示されているのは、WPFのバブリングイベントモデルの効果です。これにより、通常、子で発生するイベントが親にバブリングします。

おそらく行う必要があるのは、Source、または場合によってはMouseButtonEventArgsのOriginalSourceプロパティを確認し、TabItemタイプからのイベントにのみ応答することです。

もう1つ試してみるのは、IsMouseDirectlyOverプロパティをチェックすることです。これは、マウスが親の境界内にあるが、実際には子要素の上にある場合はfalseを返すはずです。

たとえば、タブ項目のTextBoxにIsHitTestVisibleを設定してみてください。ただし、テキストをクリックしたときに選択したタブを変更しないなど、望ましくない副作用が発生する可能性があります。

于 2010-07-01T10:26:00.577 に答える
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 に答える
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 ...
    // ...
}
于 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 に答える