gpt4 book ai didi

C# WPF : Changing PlacementTarget of a ToolTip

转载 作者:行者123 更新时间:2023-11-30 23:11:42 60 4
gpt4 key购买 nike

我正在尝试将 ToolTip 的 PlacementTarget 更改为可视化树中更上层的窗口,以便在该窗口中具有自定义 ToolTip 剪切效果。除了 PlacementTarget,我已经连接了所有东西。这是 XAML 和代码中的示例……都不起作用。此样式当前用于附加到文本框的单个工具提示。

<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.
}
}

我哪里做错了或没理解?

针对上下文进行编辑:自定义剪辑效果基本上只是找到最接近工具提示目标的祖先窗口,并使用它来确保工具提示永远不会超出该窗口的范围。

最佳答案

设置 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以错误的方式:

The ToolTipService class attached properties are used to determine the placement, behavior, and appearance of a tooltip. These properties are set on the element that defines the tooltip.

应用于样式:

<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>

至于后面代码中的第二个片段,一旦 ToolTip 打开并且 ToolTip 处于打开状态,您就无法设置 PlacementTarget关闭 PlacementTarget 为空。正如 @mm8 所指出的,这与 ToolTipPlacementTarget 位于不同的可视化树中有关,因为 ToolTip 产生一个属于自己的 Window

关于C# WPF : Changing PlacementTarget of a ToolTip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44581980/

60 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com