C# WPF: изменение PlacementTarget подсказки
Я пытаюсь изменить PlacementTarget всплывающей подсказки на окно дальше по визуальному дереву, чтобы иметь пользовательские эффекты обрезки всплывающей подсказки в этом окне. Я подключил все, кроме PlacementTarget. Вот пример из XAML и in code...ни работы. Этот стиль в настоящее время используется для одной подсказки, прикрепленной к текстовому полю.
<Style TargetType="ToolTip">
<Setter Property="ToolTipService.PlacementTarget"
Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Grid }} }" />
</Style>
Если я войду в код и посмотрю на подсказку.PlacementTarget после того, как он цепляется за что-то...это всегда текстовый. Я испробовал несколько способов использования VisualTree для получения различных элементов. Кажется, ничего не происходит. work...so я предполагаю, что не понимаю или что-то упускаю.
На самом деле меня беспокоит то, что если я войду в свой код и посмотрю на 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.
}
}
Что я делаю неправильно или не понимаю?
Редактировать для контекста: пользовательский эффект отсечения состоит в основном в том, чтобы просто найти ближайшее окно предка к цели подсказки и используйте его, чтобы убедиться, что подсказка никогда не выходит за пределы этого окна.
1 ответ:
Короткий пример, устанавливающий
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>EDIT
Чтобы ответить на ваши вопросы,
Первый фрагмент использует 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порождает aWindowСам по себе.
Comments