【发布时间】:2017-06-16 06:11:50
【问题描述】:
我正在尝试将 ToolTip 的 PlacementTarget 更改为视觉树更上方的窗口,以便在该窗口中具有自定义 ToolTip 剪辑效果。除了 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 来获取不同 UIElement 的方法。似乎没有任何效果......所以我假设我没有理解或遗漏什么。
真正让我着迷的是,如果我进入我的代码并查看工具提示的 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的方式有点混乱。它可以快速配置;看看stackoverflow.com/questions/6783693/… -
你的可视化树是如何定义的? Tooltip 位于其自己的可视化树中,无法使用 RelativeSource 在父窗口中查找内容。
-
@TimothyGroote 谢谢,我去看看。对于 mm8,我认为 RelativeSource 值将首先定位默认目标(在本例中为 TextBox)并向上移动它们的可视化树以找到第一个 Grid(但也许我需要将 AnscestorLevel 设置为 1)。但是,无论如何,我无法获得任何值来实际设置 PlacementTarget。