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

WPF自定义ToolTip无显示求助:含Header/Footer附加属性实现

解决WPF自定义ToolTip样式不显示内容的问题

嘿,我来帮你排查这个ToolTip不显示内容的问题!核心问题出在绑定路径指向错误上,咱们一步步拆解:

问题根源

你创建的Header和Footer附加属性是设置在触发ToolTip的UI元素(比如你的Button)上的,但在ToolTip的模板里,你绑定的是TemplatedParent(也就是ToolTip自身)的附加属性——可ToolTip本身并没有这些属性值啊!自然拿不到内容,所以整个ToolTip就空了。另外,ToolTip的提示文本绑定也有问题,你绑定的ToolTip属性并不是ToolTip控件自身的内容属性。

修复方案

我们需要调整模板里的绑定路径,让它指向**触发ToolTip的元素(PlacementTarget)**的附加属性,同时修正提示文本的绑定:

修改后的ToolTip样式代码

<Style TargetType="{x:Type ToolTip}"> 
    <Setter Property="MinHeight" Value="150" /> 
    <Setter Property="Width" Value="350" /> 
    <Setter Property="Foreground" Value="Black" /> 
    <Setter Property="Background" Value="#ECEFF4" /> 
    <Setter Property="BorderBrush" Value="#394F6D" /> 
    <Setter Property="Template"> 
        <Setter.Value> 
            <ControlTemplate TargetType="{x:Type ToolTip}"> 
                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1"> 
                    <Grid Background="{TemplateBinding Background}"> 
                        <Grid.RowDefinitions> 
                            <RowDefinition Height="40" /> 
                            <RowDefinition Height="*" /> 
                            <RowDefinition Height="30" /> 
                        </Grid.RowDefinitions> 
                        <!-- 绑定到PlacementTarget(触发ToolTip的元素)的Header附加属性 -->
                        <Label Grid.Row="0" MinHeight="40" 
                               Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=PlacementTarget.(local:ToolTipExtensions.Header)}" 
                               FontFamily="Arial" FontSize="13" FontWeight="Bold" Foreground="{TemplateBinding Foreground}" /> 
                        <!-- ToolTip的内容存在自身的Content属性里,直接绑定Content即可 -->
                        <TextBlock Grid.Row="1" MinHeight="40" Foreground="{TemplateBinding Foreground}" 
                                   Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" /> 
                        <!-- 绑定到PlacementTarget的Footer附加属性 -->
                        <Label Grid.Row="2" MinHeight="30" 
                               Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=PlacementTarget.(local:ToolTipExtensions.Footer)}" 
                               FontFamily="Arial" FontSize="12" FontStyle="Italic" FontWeight="Regular" /> 
                    </Grid> 
                </Border> 
            </ControlTemplate> 
        </Setter.Value> 
    </Setter> 
</Style>

关键修改点说明

  1. Header/Footer的绑定:把原来的Path=(local:ToolTipExtensions.Header)改成Path=PlacementTarget.(local:ToolTipExtensions.Header),PlacementTarget就是触发ToolTip的那个UI元素(比如你的Button),这样就能拿到你设置在Button上的附加属性值了。
  2. 提示文本的绑定:ToolTip控件的内容是存储在Content属性里的(也就是你在Button上设置的ToolTip="Some fancy Text"),所以把原来的Path=ToolTip改成Path=Content就能正确显示提示文本。

验证使用示例

你的Button代码不需要修改,保持原样即可:

<Button local:ToolTipExtensions.Header="Button" local:ToolTipExtensions.Footer="To show additional Info" 
        Content="Test" ToolTip="Some fancy Text" 
        ToolTipService.InitialShowDelay="500" ToolTipService.ShowDuration="999999999" />

另外要确保XAML里的local命名空间正确指向ToolTipExtensions类所在的.NET命名空间,比如:

xmlns:local="clr-namespace:你的命名空间名称"

这样修改后,你的ToolTip应该就能正常显示Header、提示文本和Footer了!

内容的提问来源于stack exchange,提问作者SyLuS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:38:37