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>
关键修改点说明
- Header/Footer的绑定:把原来的
Path=(local:ToolTipExtensions.Header)改成Path=PlacementTarget.(local:ToolTipExtensions.Header),PlacementTarget就是触发ToolTip的那个UI元素(比如你的Button),这样就能拿到你设置在Button上的附加属性值了。 - 提示文本的绑定: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
相关产品推荐
相关产品推荐

