4

TreeViewItemをスタイリングしています。アイテムには、ツールチップを表示させたいコンテンツプレゼンターがあります。

<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は初めてですので、失礼します。

4

3 に答える 3

6

ツールチップやその他のポップアップはメインのビジュアルツリーの外部に存在するため、RelativeSourceを使用して親にアクセスすることはできません。代わりに、ToolTipのPlacementTargetプロパティを使用して、その親ContentPresenterにアクセスしてみてください。

Content="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget.Content}"
于 2013-01-31T02:20:21.807 に答える
0

ツールチップまたはポップアップがそれらを作成するコントロールの子であるかのように、Bindingを使用したいと思います。前の答えでは、私はそれを行うことはできません。カスタムツールチップの例を作成しますが、ポップアップやビヘイビアーの使用などに使用できます。簡単です。私のカスタムツールチップ:

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>
于 2016-06-23T09:19:14.840 に答える
0

ツールチッププロパティ自体にバインディングを追加する理由がわかりませんか?

<ContentPresenter ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=Content}">
于 2021-10-18T18:02:11.053 に答える