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

时间:2015-04-26 20:46:12

标签: c# wpf

我有这段代码:

<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的某些属性计算工具提示的偏移量。工具提示相对于边框显示,并手动更改偏移量按预期工作。但是,当我尝试在转换器中访问ToolTip的PlacementTarget属性时,它为null ...

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

我也试过通过<Binding RelativeSource="{RelativeSource AncestorType={x:Type Border}}"/>边框无效。

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

1 个答案:

答案 0 :(得分:0)

我设法找到了解决方法:

<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,而是Border ...

我很确定这是一些WPF错误。希望有人能够得到这篇文章的帮助。