我正在尝试将工具提示的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永远不会超出该窗口的范围。
答案 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指出的那样,这与ToolTip
和PlacementTarget
位于不同的视觉树中有关,因为ToolTip
产生了Window
它自己的{{1}}。