我试图将工具提示的PlacementTarget更改为视觉树上的一个窗口,以便在该窗口中具有自定义工具提示裁剪效果。除了PlacementTarget之外,我已经吸引了所有人。这里有一个来自XAML和代码的例子......都不起作用。此样式当前正在用于连接到TextBox的单个工具提示。C#WPF:更改工具提示的PlacementTarget
<Style TargetType="ToolTip">
<Setter Property="ToolTipService.PlacementTarget"
Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Grid }} }" />
</Style>
如果我进入代码,并期待在tooltip.PlacementTarget一旦它的附加的东西......它总是设置为文本框。我尝试过使用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.
}
}
我在做什么不正确或不理解?
上下文编辑:自定义剪切效果基本上只是找到最接近的工具提示目标的祖先窗口,并使用它来确保工具提示永远不会超出该窗口的范围。
WPF的工具提示与PlacementTarget和DataContext一起工作的方式有些杂乱。它获得配置快速使用;看看在https://stackoverflow.com/questions/6783693/how-to-set-a-placementtarget-for-a-wpf-tooltip-without-messing-up-the-datacontex –
你的视觉树如何定义?工具提示驻留在自己的可视化树中,并且无法使用RelativeSource在父窗口中查找某些内容。 – mm8
@TimothyGroote谢谢,我会检查出来。对于mm8,我认为RelativeSource值首先会定位到默认目标(在这种情况下是TextBox),然后向上移动它们的可视化树来查找第一个Grid(可能需要将AnscestorLevel设置为1)。但是,无论如何,我无法真正设置PlacementTarget。 – user2079828