WPF工具提示放置目标返回null



我有这个代码:

<DataTemplate>                                
<Border>
<Border.ToolTip>
<ToolTip IsEnabled="True"
Placement="Right">
<ToolTip.VerticalOffset>
<MultiBinding Converter="{StaticResource OffsetConverter}"
ConverterParameter="Vertical">
<MultiBinding.Bindings>
<Binding RelativeSource="{RelativeSource Self}"/>
</MultiBinding.Bindings>
</MultiBinding>
</ToolTip.VerticalOffset>
<TextBlock Margin="0" 
Padding="0"
TextAlignment="Left"
TextWrapping="Wrap" 
MaxWidth="200"
Text="{Binding Description}" FontStyle="Italic">
</TextBlock>
</ToolTip>
</Border.ToolTip>                                    
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" Margin="0">
<Image Height="16" Width="16" Style="{StaticResource AutoCompletionImageStyle}" Margin="0"/>
<Label Content="{Binding DisplayText}" Margin="0" Padding="0"/>
</StackPanel>
</Border>
</DataTemplate>

这个转换器:

public object Convert(object[] values, Type targetType, object parameter, 
System.Globalization.CultureInfo culture)
{
AutoCompletionViewModel.OffsetType offsetType = (AutoCompletionViewModel.OffsetType)Enum.Parse(typeof(AutoCompletionViewModel.OffsetType), parameter.ToString());
ToolTip tooltip = values[0] as ToolTip;
Border border = tooltip.PlacementTarget as Border;
double aCalculatedOffset = 0.0;
return aCalculatedOffset;
}

我需要根据Border的一些属性计算工具提示的偏移量。工具提示相对于边界显示,手动更改偏移可以按预期工作。但是,当我尝试访问转换器中工具提示的PlacementTarget属性时,它是空的。。。

因此,尽管ToolTip是Border的直接子项,并且应该将其作为放置目标,但在代码中它是null。知道我在这里缺了什么吗?

我还试图通过与<Binding RelativeSource="{RelativeSource AncestorType={x:Type Border}}"/>的边界,但没有成功。

我真的很困惑,因为如果边框不是ToolTip的逻辑或视觉父级,ToolTip如何正确放置自己?!

我设法找到了一个解决方法:

<DataTemplate>
<Border ToolTipOpening="OnAutoCompletionBorderToolTipOpening">
<Border.ToolTip>
<ToolTip>
<ToolTip.Style>
<Style>
<EventSetter Event="ToolTip.Opened" Handler="ToolTipOpenedHandler" />
</Style>
</ToolTip.Style>
</ToolTip>
</Border.ToolTip>
</Border>
</DataTemplate>

代码背后:

private void ToolTipOpenedHandler(object sender, RoutedEventArgs e)
{
ToolTip toolTip  = (ToolTip)sender;
UIElement target = toolTip.PlacementTarget;
var rect = toolTip.PlacementRectangle;
}

这里的目标不是null,而是边界。。。

我很确定这是一些WPF错误。希望有人能得到这个帖子的帮助。

最新更新