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

标签 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”上 ->(无工具提示)<确定
  • 将鼠标悬停在“blablablabla.....”->(工具提示)<确定
  • 将鼠标悬停在“文本 1”上 ->(无工具提示)<确定
  • 悬停“blablablabla.....”->(工具提示)<但仅显示 blabla(基于我认为“文本 1”的宽度)不行
  • 将鼠标悬停在“文本 1”上 ->(无工具提示)<确定
  • 悬停“blablablabla.....” ->(工具提示)<确定(返回正常状态)
  • 将鼠标悬停在“文本 1”上 ->(无工具提示)<确定
  • 悬停“blablablabla.....”->(工具提示)<但仅显示 blabla(基于我认为“文本 1”的宽度)不行
  • 将鼠标移至“blablabla...”下方,然后再次将鼠标悬停在“blablabla”上 ->(工具提示,但尺寸仍然很小...)不行
  • 重复直到你累为止:x

所以问题是由于我重复使用相同的工具提示而引起的(因为在绑定(bind)正确时工具提示的宽度以某种方式不会刷新)

谁能给我解释一下吗?无论如何我怎样才能更新宽度?

提前感谢各位大师!

盖尔

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

编辑:已发布答案

最佳答案

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

将可见性设置为隐藏解决了这个问题。 如果有人仍然可以解释,那就太好了!

关于WPF 资源工具提示未更新其大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25668553/

相关文章:

wpf - 如何将嵌套在类中的枚举分配给 XAML 属性?

c# - 将方法从 View 移动到 View 模型 - WPF MVVM

javascript - 如何在 d3 工具提示的 html 元素中使用 Angularjs 过滤器?

javascript - 如何使用 jQuery 制作一个简单的 mouseon 弹出工具提示?

c# - slider 绑定(bind)导致性能显着下降

c# - 当实体集 ChangeTracker 发生更改时如何通知 UI

c# - 将数据绑定(bind)/设置源到我的 DataGrid [WPF] 的正确方法是什么

vb.net - 如何在 .Net 中的 ListView 子项上设置工具提示

.net - 更改工具提示字体

jquery - 如何在点击时显示工具提示