C#WPF:更改工具提示的PlacementTarget

时间:2017-06-16 06:11:50

标签: c# wpf xaml

我正在尝试将工具提示的PlacementTarget更改为可视树以外的窗口,以便在该窗口中具有自定义工具提示剪切效果。除了PlacementTarget之外,我已经把所有东西都搞定了。这是XAML和代码中的一个例子......都不起作用。此样式当前用于附加到TextBox的单个工具提示。

<Style TargetType="ToolTip">
    <Setter Property="ToolTipService.PlacementTarget"
            Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
                AncestorType={x:Type Grid }} }" />
</Style>

如果我进入代码并查看tooltip.PlacementTarget一旦附加到某个东西......它总是设置为TextBox。我已经尝试了多种方法来使用VisualTree来获得不同的UIElements。似乎没有什么工作......所以我假设我不理解或遗漏某些东西。

真正让我感觉的是,如果我进入我的代码并查看工具提示的PlacementTarget,它就不会让我将其设置为其他任何东西。例如:

var ancestors = toolTip.PlacementTarget.GetSelfAndAncestors();

foreach(var ancestor in ancestors)
{
    if(var ancestor is Grid)
    {
        // Conditional always hits.
        // Before this line, PlacementTarget is a TextBox.
        toolTip.PlacementTarget = (UIElement)ancestor;  
        // After the line, PlacementTarget is still a TextBox.
    }
}

我做错了什么或不理解?

编辑上下文:自定义剪切效果基本上只是找到与ToolTip目标最近的祖先窗口,并使用它来确保ToolTip永远不会超出该窗口的范围。

1 个答案:

答案 0 :(得分:2)

设置Tooltip的简短示例,使用父Window上的属性PlacementTarget

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Tag="Bar">
    <Window.Resources>
        <ToolTip x:Key="FooToolTip">
            <StackPanel>
                <TextBlock Text="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource AncestorType={x:Type ToolTip}}}"/>
            </StackPanel>
        </ToolTip>
    </Window.Resources>
    <Grid>
        <TextBlock 
            Text="Foo"
            ToolTip="{StaticResource FooToolTip}"
            ToolTipService.PlacementTarget="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
            HorizontalAlignment="Center" VerticalAlignment="Center" Height="20" Width="50">
        </TextBlock>
    </Grid>
</Window>

修改

回答你的问题,

第一个代码段以错误的方式使用ToolTipService

  

ToolTipService类附加属性用于确定工具提示的位置,行为和外观。 这些属性在定义工具提示的元素上设置。

应用于一种风格:

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        Tag="Bar">
    <Window.Resources>
        <ToolTip x:Key="FooToolTip">
            <StackPanel>
                <TextBlock Text="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource AncestorType={x:Type ToolTip}}}"/>
            </StackPanel>
        </ToolTip>
        <Style x:Key="ToolTipStyle">
            <Setter Property="ToolTipService.ToolTip" Value="{StaticResource FooToolTip}"/>
            <Setter Property="ToolTipService.PlacementTarget" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
        </Style>
    </Window.Resources>
    <Grid>
        <TextBlock 
            Text="Foo" Style="{StaticResource ToolTipStyle}"
            HorizontalAlignment="Center" VerticalAlignment="Center" Height="20" Width="50">
        </TextBlock>
    </Grid>
</Window>

对于代码中的第二个代码段,您无法在PlacementTarget打开后设置ToolTip,而ToolTip关闭时PlacementTarget为空。正如@ mm8指出的那样,这与ToolTipPlacementTarget位于不同的视觉树中有关,因为ToolTip产生了Window 它自己的{{1}}。