WPF资源工具提示未更新其大小

时间:2014-09-04 14:49:56

标签: wpf tooltip

我遇到了一个我无法解释/解决的小问题:x (可以通过不将工具提示放在资源中并复制工具提示代码来完成解决,但在我看来这不是一个好的解决方案)

我想要实现的是仅在修剪文本时显示工具提示。 网上有很多解决方案。问题不在于:)

问题在于我将工具提示放在资源中(因此只有1个工具提示对象)然后,看起来工具提示的宽度不会按原样重新计算/刷新。

PS:我已经为窗口设置了这个尺寸(一定要修剪)

Height="100" Width="200"

让我们看看代码:

<Window.Resources>
    <converters:TextTrimmedToVisibilityConverter x:Key="TextTrimmedToVisibilityConverter" />

    <ToolTip x:Key="TrimmedTooltip" 
             DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}"
             Visibility="{Binding ., Converter={StaticResource TextTrimmedToVisibilityConverter}}">
        <ToolTip.Content>
            <TextBlock Text="{Binding Text}" />
        </ToolTip.Content>
    </ToolTip>
</Window.Resources>
<Grid>
    <StackPanel>
        <TextBlock Text="Text 1" TextTrimming="CharacterEllipsis" ToolTip="{StaticResource TrimmedTooltip}" />
        <TextBlock Text="blablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablabla" TextTrimming="CharacterEllipsis" ToolTip="{StaticResource TrimmedTooltip}" />
    </StackPanel>
</Grid>

这是转换器:

public class TextTrimmedToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null) return Visibility.Collapsed;

        // Retrieve the TextBlock which may need the tooltip (PlacementTarget of the ToolTip)
        FrameworkElement fe = (FrameworkElement)value;
        // Measure it without the eventual trimming to get the exact desired size
        fe.Measure(new System.Windows.Size(Double.PositiveInfinity, Double.PositiveInfinity));

        // Now we know if the tooltip needs to be displayed
        if (fe.ActualWidth < fe.DesiredSize.Width)
            return Visibility.Visible;
        else
            return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

错误的行为可以通过以下方式获得:

  • 悬停'文字1' - &gt; (没有工具提示)&lt;行
  • 悬停'blablablabla .....' - &gt; (工具提示)&lt;行
  • 悬停'文字1' - &gt; (没有工具提示)&lt;行
  • 悬停'blablablabla .....' - &gt; (工具提示)&lt;但只显示blabla(基于我认为'文字1'的宽度)不行
  • 悬停'文字1' - &gt; (没有工具提示)&lt;行
  • 悬停'blablablabla .....' - &gt; (工具提示)&lt;确定(回到正常状态)
  • 悬停'文字1' - &gt; (没有工具提示)&lt;行
  • 悬停'blablablabla .....' - &gt; (工具提示)&lt;但只显示blabla(基于我认为'文字1'的宽度)不行
  • 将鼠标移动到'blablabla ...'并再次悬停'blablabla' - &gt; (工具提示,但仍然很小......)不行。
  • 重复直到你累了:x

所以问题是由于我重复使用相同的工具提示这一事实(因为工具提示的宽度在绑定被修正时不会刷新)

任何人都能解释一下这个吗?我怎样才能更新宽度?

先谢谢大师!

GAEL

PS:我正在使用VS 2010 SP1,该项目是.NET 4 Client Profile

编辑:回答发布

1 个答案:

答案 0 :(得分:2)

嗯,问题是因为我在转换器中使用了Visibilty.Collapsed,我认为它不允许以某种方式计算工具提示的大小。

将可见性设置为Hidden解决了它。 如果有人能够解释,那就太棒了!