如果需要,显示WPF工具提示

26
我在一个有限大小的控件内放置了一个TextBlock。如果文本太长无法适应控件,我希望显示完整文本的工具提示。这是许多应用程序中经典的行为,你肯定知道。
我尝试使用Converter将TextBlock的宽度转换为Tooltip的可见性。
<GridViewColumn.CellTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding Text}">
            <TextBlock.ToolTip>
                <ToolTip 
                    DataContext="{TemplateBinding Content}" 
                    Visibility="{Binding Converter={StaticResource visConvert}}">

                        <TextBlock Text="{Binding Text}"></TextBlock>
                </ToolTip>
            </TextBlock.ToolTip>
        </TextBlock>
    </DataTemplate>
</GridViewColumn.CellTemplate>
问题在于Converter中:
public object Convert(object value, ...

'value'是绑定的数据项。我希望将'value'作为TextBlock,以观察其宽度,并将其与GridViewColumn.Width进行比较。

3个回答

33

我搞清楚了,Tooltip有一个PlacementTarget属性,它指定了具有Tooltip的UI元素。如果有人需要:

<TextBlock Text="{Binding Text}">
    <TextBlock.ToolTip>
        <ToolTip 
             DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}" 
             Visibility="{Binding Converter={StaticResource toolVisConverter}}">
             <TextBlock Text="{Binding Text}"/>  <!-- tooltip content -->
         </ToolTip>
    </TextBlock.ToolTip>
</TextBlock>

然后编写一个转换器,将 TextBlock 转换为 Visibility(基于 TextBlock 的宽度)。


我认为 Visibility="{Binding Converter={StaticResource toolVisConverter}}" 不是必要的。 - NoWar

6

好的,那么为什么要走复杂的XAML-only方式呢?这种方法可以解决问题:

<TextBlock Text="{Binding Text}"
     IsMouseDirectlyOverChanged="TextBlock_IsMouseDirectlyOverChanged" >
     <TextBlock.ToolTip>
     <ToolTip Visibility="Collapsed">
         <TextBlock Text="{Binding Text}"></TextBlock>
     </ToolTip>
     </TextBlock.ToolTip>
</TextBlock>

在 Control.xaml.cs 中:
private void TextBlock_IsMouseDirectlyOverChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    bool isMouseOver = (bool)e.NewValue;
    if (!isMouseOver)
        return;
    TextBlock textBlock = (TextBlock)sender;
    bool needed = textBlock.ActualWidth > 
        (this.listView.View as GridView).Columns[2].ActualWidth;
    ((ToolTip)textBlock.ToolTip).Visibility = 
        needed ? Visibility.Visible : Visibility.Collapsed;
}

启用TextTrimming后,这个会起作用吗?因为这样TextBlock可能不会占用超过可用空间的空间。 - ygoe

0
我认为您需要查看ControlTemplate触发器来解决这个问题。不幸的是,ControlTemplate触发器总是与特定值进行比较,而不是小于或大于。您可以使其出现,例如如果宽度=100,则不是宽度<100。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接