【问题标题】:How to make only the header of the tabitem respond to the mouse event如何只让tabitem的头部响应鼠标事件
【发布时间】:2011-03-10 13:38:12
【问题描述】:

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

【问题讨论】:

    标签: wpf header tabcontrol tabitem


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 源始终显示为 TabItem,与单击的区域无关。有效点击的原始来源各不相同,它可以是 System.Windows.Documents.Run 或 System.Windows.Controls.Border 等,具体取决于点击的标题区域。我可以检查所有这些类型,但如果可能的话,我想使用更清洁的解决方案。我应该在标题中放置一个模板吗?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      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】:

        我有与原始问题相同的需求,但出于一个原因和另一个原因,我不想深入研究 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 ...
            // ...
        }
        

        【讨论】:

          【解决方案5】:

          对于其他人,获取 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>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-16
            • 2012-11-10
            • 1970-01-01
            • 2016-07-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多