我遇到了一个无法解释/解决的小问题: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/