绑定工具提示到内容呈现器的内容

4

我正在样式化一个TreeViewItem。该项具有内容Presenter,我希望出现工具提示:

<ContentPresenter x:Name="PART_Header"
             Cursor="Hand"
             Grid.Column="1"
             ContentSource="Header"
             HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}">
   <ContentPresenter.ToolTip>
       <ToolTip 
                 Placement="RelativePoint" 
                 VerticalOffset="-2" 
                 HasDropShadow="False"
                 BorderBrush="#767676" 
                 Background="#FFF" 
                 Padding="0,1,0,1"
                 VerticalAlignment="Center"
                 Content="{Binding RelativeSource={RelativeSource FindAncestor, 
                 AncestorType={x:Type ContentPresenter}}, Path=Content}"/>
   </ContentPresenter.ToolTip>
</ContentPresenter>

实际上,这是设置项目控件模板的一部分。然而,我似乎无法将工具提示内容绑定到内容呈现器的内容上。它一直显示为空白(一个小黑框)。由于我对绑定和WPF不熟悉,请多包涵。

3个回答

7

工具提示和其他弹出窗口存在于主视觉树之外,因此无法使用RelativeSource访问其父级。相反,尝试使用ToolTip的PlacementTarget属性来访问其父级ContentPresenter:

Content="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget.Content}"

谢谢你的回答,这个问题让我苦恼了好几个小时。 - user2014629
1
这个绑定创建了一个错误:如果我有一个TreeView项目图像,当工具提示完成显示时,绑定似乎会删除treeviewitem的内容。你知道有什么解决方法吗? - user2014629
2
尝试将图像放入您的工具提示中,并将Source属性绑定在一起,而不是Content本身。当Content是UI元素而不是文本或数据时,它可能会拉入Image控件本身,这个控件无法同时拥有两个父级,因此会破坏它。 - John Bowen

0

我想使用绑定,就像我的工具提示或弹出窗口是由创建它们的控件的子级一样。 在之前的答案中,我无法做到这一点。 我为自定义工具提示编写了一个示例,但您可以为弹出窗口使用行为或其他方式 - 这很容易。 我的自定义工具提示:

public class ToolTipEx : ToolTip
{
    private readonly FrameworkElement _coreParent;

    static ToolTipEx()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(ToolTipEx), new FrameworkPropertyMetadata(typeof(ToolTipEx)));
    }

    public ToolTipEx(FrameworkElement parent)
    {
        _coreParent = parent;
    }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        var method = typeof(FrameworkElement).GetMethod("AddLogicalChild", BindingFlags.Instance | BindingFlags.NonPublic);
        method.Invoke(_coreParent, new object[] { Parent });
    }
}

在此之后,您可以使用正确的绑定:

<Style TargetType="{x:Type controls:ToolTipEx}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ToolTip}">
                <Border Background="Black"
                        CornerRadius="3">
                    <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type controls:MyControl}}, Path=MyProperty}"
                               Margin="1"
                               Foreground="#FFFFFF"
                               FontWeight="Bold"
                               TextTrimming="CharacterEllipsis"
                               TextWrapping="NoWrap"
                               TextAlignment="Center"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

0
我不明白为什么你只是将绑定添加到工具提示属性本身?
<ContentPresenter ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=Content}">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接