GridViewColumn 工具提示未考虑样式

Style not taken in account on GridViewColumn ToolTip

所以我有以下问题:

在我的 ListView 中,我想将 ToolTips 添加到特定的 GridViewColumns。 有时这些 ToolTips 是空的,我需要隐藏它们。

当我在 ListView 行上有一个 ToolTip 时,我在 App.xaml 文件中执行以下操作没有遇到问题:

<Style TargetType="ToolTip">
   <Style.Triggers>
      <Trigger Property="Content" Value="{x:Static sys:String.Empty}">
         <Setter Property="Visibility" Value="Collapsed" />
      </Trigger>
      <Trigger Property="Content" Value="{x:Null}">
         <Setter Property="Visibility" Value="Collapsed" />
      </Trigger>
   </Style.Triggers>
</Style>

但如果 ToolTip 仅应用于我的 ListView 的一列,我的 XAML 如下:

<GridViewColumn Header="{x:Static p:Resources.Name}" Width="100">
   <GridViewColumn.CellTemplate>
      <DataTemplate>
         <Grid>
            <TextBlock Text="{Binding Path=Name}" Tag="{Binding Name}" 
                       MouseMove="mouseOverNameRepere">
               <TextBlock.ToolTip>
                   <StackPanel>
                      <Grid>
                         <TextBlock Grid.Column="0" 
                                    Text="{Binding Path=ToolTipModifications}" 
                                    TextAlignment="Left" HorizontalAlignment="Left"/>
                      </Grid>
                   </StackPanel>
               </TextBlock.ToolTip>
            </TextBlock>
         </Grid>
      </DataTemplate>
   </GridViewColumn.CellTemplate>
</GridViewColumn>

空的ToolTip如何隐藏?我的 App.xaml 中的代码不起作用。 还尝试在后面的代码中做到这一点:

TextBlock item = (TextBlock)sender;
ToolTip toolTip = (ToolTip)item.ToolTip;

但是第二行给了我一个例外,因为 item.ToolTip 是一个 StackPanel 对象并且不能被转换? 其实我是在输入TextBox元素的时候才计算出ToolTip内容的,所以我想这时候再检查并应用toolTip.Visibility,但是我做不到。

请试试这个代码:

<DataGridTextColumn Width="200" Binding="{Binding Name}">
    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource TextBlockDefaultStyle}">
            <Setter Property="ToolTip" Value="{Binding Name}">
            <Setter Property="ToolTipService.ShowDuration" Value="6000"> 
        </Style> 
    </DataGridTextColumn.ElementStyle> 
</DataGridTextColumn> 

使用矩形代替工具提示

<GridViewColumn Header="{x:Static p:Resources.Name}" Width="100">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <Grid>
                <TextBlock Text="{Binding Path=Name}" Tag="{Binding Name}"/>
                <Rectangle Fill="Transparent" ToolTipService.ToolTip="{Binding Path=ToolTipModifications}" MouseEnter="UIElement_OnMouseEnter"/>
            </Grid>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

然后在MouseEnter事件中检查ToolTipModifications是否为空

private void UIElement_OnMouseEnter(object sender, MouseEventArgs e)
{
    if (sender is Rectangle rectangle)
    {
        if (string.IsNullOrEmpty(rectangle.ToolTip.ToString()))
        {
            rectangle.Visibility = Visibility.Collapsed;
        }
    }
}

如果您像这样设置 TextBlockToolTip 属性,您的 Style 应该可以工作:

<TextBlock Text="{Binding Path=Name}" Tag="{Binding Name}" MouseMove="mouseOverNameRepere" 
           ToolTip="{Binding Path=ToolTipModifications}" />