【问题标题】:Show WPF Tooltip if needed如果需要,显示 WPF 工具提示
【发布时间】:2010-11-10 02:20:20
【问题描述】:

我在有限大小的控件中有一个 TextBlock。如果文本太长而无法放入控件,我想显示一个带有全文的工具提示。这是您肯定从许多应用程序中知道的经典行为。

我尝试使用转换器将 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>

问题在于转换器中:

public object Convert(object value, ...

'value' 是 DataBound 项。我希望“值”是 TextBlock,观察其宽度,并将其与 GridViewColumn.Width 进行比较。

【问题讨论】:

    标签: c# wpf conditional tooltip


    【解决方案1】:

    我想通了,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的Converter(基于TextBlock的宽度)。

    【讨论】:

    • 我认为Visibility="{Binding Converter={StaticResource toolVisConverter}}" 不是必需的。
    【解决方案2】:

    好的,那么为什么要采用仅限 XAML 的硬方式呢?这有效:

    <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 可能不会占用比可用空间更多的空间。
    【解决方案3】:

    我认为您必须查看 ControlTemplate 触发器才能解决此问题。不幸的是,ControlTemplate 触发器总是与特定值进行比较,不小于或大于。你可以让它出现,例如如果 Width = 100,而不是 Width

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 2011-07-20
      • 2019-11-29
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      相关资源
      最近更新 更多