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

Mar*_*cek 23 c# wpf conditional tooltip

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

我尝试使用Converter将TextBlock宽度转换为Tooltip的Visibility.

<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>
Run Code Online (Sandbox Code Playgroud)

问题是在转换器中:

public object Convert(object value, ...
Run Code Online (Sandbox Code Playgroud)

'value'是DataBound项.我希望'value'成为TextBlock,观察它的宽度,并将它与GridViewColumn.Width进行比较.

Mar*_*cek 32

我想通了,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>
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*cek 5

好的,为什么要采用仅使用XAML的硬方法?这有效:

<TextBlock Text="{Binding Text}"
     IsMouseDirectlyOverChanged="TextBlock_IsMouseDirectlyOverChanged" >
     <TextBlock.ToolTip>
     <ToolTip Visibility="Collapsed">
         <TextBlock Text="{Binding Text}"></TextBlock>
     </ToolTip>
     </TextBlock.ToolTip>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)

在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;
}
Run Code Online (Sandbox Code Playgroud)