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


Что я делаю неправильно или не понимаю?



Редактировать для контекста: пользовательский эффект отсечения состоит в основном в том, чтобы просто найти ближайшее окно предка к цели подсказки и используйте его, чтобы убедиться, что подсказка никогда не выходит за пределы этого окна.

611   1  

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 порождает a Window Сам по себе.

Comments

    Ничего не найдено.