2010-07-01 39 views
0

我只想让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的头部来引发事件 - 任何想法?

回答

0

对于其他人来说,最终的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> 
2

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

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

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

您可以尝试设置IsHitTestVisible上的标签项目中的文本框,但是您可能会发现它具有不良的副作用,例如在您单击文本时未更改所选标签。

+0

源始终显示为TabItem,不管点击的区域如何。有效点击的原始来源各不相同,它可以是System.Windows.Documents.Run或System.Windows.Controls.Border等,具体取决于所点击的标题区域。 我可以检查所有这些类型,但我希望尽可能使用更清洁的解决方案。 我应该将模板放入标题吗? – Will 2010-07-01 10:40:10

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

谢谢Leom,作品完美。 – Will 2010-07-01 13:42:25

1

我有同样的需求,因为原来的的问题,但由于种种原因,另外我也不想深究XAML得到这个工作......所以这quick'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 ... 
    // ... 
} 
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 
       } 
     }