You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为WPF中基于DragablzItem的Infragistics只读标签添加ToolTip

解决方案

问题原因

你在IsMouseOver触发器里直接嵌套ToolTipService.ToolTip的写法错误——触发器中必须通过Setter设置依赖属性,而非直接添加元素。另外,DragablzItem的默认模板可能存在子元素(如标签内容容器)抢占鼠标事件的情况,导致父控件的IsMouseOver状态无法正确触发。

修复步骤

1. 用Setter正确设置ToolTip

把Trigger里的ToolTip改为Setter形式,或者直接在Style的全局Setter中定义(ToolTip默认就是鼠标悬停时显示,无需在IsMouseOver触发器内单独设置)。修改后的Style示例:

<Style x:Key="DragablzItemStyle" 
       BasedOn="{StaticResource MaterialDesignDragableTabItemStyle}" 
       TargetType="{x:Type dragablz:DragablzItem}">
    <Setter Property="Foreground" Value="{Binding ThemeMainForeground, Source={x:Static app:App.Instance}}"/>
    <Setter Property="IsEnabled" Value="{Binding DataContext.IsVersionActive, RelativeSource={RelativeSource AncestorType={x:Type dragablz:TabablzControl}}}"/>
    <!-- 全局设置ToolTip,默认鼠标悬停时显示 -->
    <Setter Property="ToolTipService.ToolTip" Value="Tooltip Text Here"/>
    
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Opacity" Value="0.6"/>
        </Trigger>
        <Trigger Property="IsSelected" Value="False">
            <Setter Property="Background" Value="transparent"/>
            <Setter Property="Foreground" Value="#bebebe"/>
        </Trigger>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="#FFE5E5E5"/>
            <Setter Property="Foreground" Value="{Binding ThemeMainForeground, Source={x:Static app:App.Instance}}"/>
        </Trigger>
    </Style.Triggers>
</Style>

2. 处理模板抢占鼠标事件的情况

如果上述修改后仍不生效,说明DragablzItem模板内的子元素(如ContentPresenter)未将鼠标事件传递给父控件。可通过修改模板,让子元素继承父控件的ToolTip并禁止自身单独处理:

<Style x:Key="DragablzItemStyle" 
       BasedOn="{StaticResource MaterialDesignDragableTabItemStyle}" 
       TargetType="{x:Type dragablz:DragablzItem}">
    <!-- 省略原有Setter和Triggers -->
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type dragablz:DragablzItem}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <!-- 让ContentPresenter继承父控件的ToolTip,同时禁止自身处理ToolTip逻辑 -->
                    <ContentPresenter Content="{TemplateBinding Content}"
                                      ContentTemplate="{TemplateBinding ContentTemplate}"
                                      ToolTip="{TemplateBinding ToolTip}"
                                      ToolTipService.IsEnabled="{TemplateBinding IsEnabled}"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

3. 针对只读/禁用标签的特殊处理

如果标签处于禁用状态(IsEnabled=False),默认ToolTip不会显示,需添加ToolTipService.ShowOnDisabled="True"强制显示:

<Setter Property="ToolTipService.ShowOnDisabled" Value="True"/>
<Setter Property="ToolTipService.ToolTip" Value="Tooltip Text Here"/>

关键注意点

  • ToolTip的显示逻辑由ToolTipService控制,默认行为就是鼠标悬停时显示,无需在IsMouseOver触发器中额外设置。
  • 确保DragablzItem的IsHitTestVisible属性为True(默认值为True,除非被模板或其他设置修改)。
  • 若需动态绑定ToolTip内容,直接绑定到ToolTip属性即可,例如:{Binding TabTooltipText}

内容的提问来源于stack exchange,提问作者Aleksandar Mijatović

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 02:19:58