WPF中的XAML:当ToolTip文本为空时隐藏ToolTip弹出窗口

6
我正在尝试在WPF表单的DataGrid单元格上设置ToolTip。虽然可以实现,但我不希望在没有弹出文本需要显示的单元格中弹出。
我看到过类似的问题在这里被问到,但我无法让那些解决方案起作用。
这是CellTemplate:
<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <Image Source="{Binding itemType}" VerticalAlignment="Center">
            <ToolTipService.ToolTip>
                    <TextBlock Text="{Binding toolTipText}" />
            </ToolTipService.ToolTip>
        </Image>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

为了避免弹出空白工具提示文本,我已经添加了以下内容:
<DataGrid.Resources>
<Style x:Key="{x:Type ToolTip}" TargetType="{x:Type ToolTip}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ToolTip}">
                <Border Background="Black" Visibility="{TemplateBinding Content, Converter={StaticResource StringToVisibilityConverter}}" >
                    <TextBlock  Width="50" FontFamily="Tahoma" FontSize="11" Text="{TemplateBinding Content}" Foreground="WhiteSmoke" Padding="2" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
</DataGrid.Resources>

StringToVisibilityConverter 的定义如下:

public class StringToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
        var stringValue = String.Empty;
        if (value is System.Windows.Controls.TextBlock) stringValue = (value as System.Windows.Controls.TextBlock).Text;
        else stringValue = value as string;
        return string.IsNullOrWhiteSpace(stringValue) ?
                                         Visibility.Hidden : Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType,
                              object parameter, CultureInfo culture)
    {
        return value;
    }
}

我看到的是,当文本为空时,它不会弹出工具提示(很好),但当有文本时,它会弹出一个黑色矩形。
如果没有tooltip样式设置,文本框可以正常弹出(除了空文本也会弹出)。
当我删除时,
Background="Black"

如果边框样式设置了,但我没有看到任何弹出内容。


我注意到您将textBlock作为Tooltip的内容,然后在模板上将Content绑定到TextBlock的Text。在我的回答中,我会提供一种更简单的方法。但是,无论是单列还是您想要重用工具提示,都可以使用这种方法。 - Nikita Shrivastava
2个回答

7
你可以使用以下单元格模板使其更简单:
<DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Image Source="{Binding itemType}" VerticalAlignment="Center">
             <Image.ToolTip>
                <ToolTip Visibility="{Binding toolTipText, Converter={StaticResource StringToVisibilityConverter}}">
                  <Border Background="Black" >
                    <TextBlock Text="{Binding toolTipText}" />
                  </Border>
               </ToolTip>                    
            <Image.ToolTip>
          </Image>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>

转换器可以简化为:

public class StringToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return String.IsNullOrEmpty(value as string) ? Visibility.Collapsed : Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

иҝҷйҮҢзҡ„дёҖдёӘйҮҚиҰҒе…ій”®жҳҜдҪҝз”ЁVisibility.CollapsedиҖҢдёҚжҳҜVisibility.HiddenгҖӮ - Wonko the Sane
“隐藏”似乎更直观。为什么“折叠”更好? - George Hernando
那对我有用!虽然我不完全明白为什么之前的方法不起作用。 - George Hernando
不同之处在于Visibility.Hidden隐藏控件,但保留其在布局中占用的空间。因此,它呈现空白而不是控件。Visibilty.Collapsed不呈现控件,也不保留空白。控件占用的空间被“折叠”,因此得名。 - Nikita Shrivastava
首先,因为当文本(前景为黑色)和背景也是黑色时,您无法看到文本。其次,文本(字符串类型)绑定到内容(对象类型)而不使用转换器,因此内容中有文本,但没有办法获取它(没有转换器)。希望现在清楚了 :) - Nikita Shrivastava

1
你可以尝试编辑ToolTip模板并添加触发器,以在ToolTip没有内容时折叠它。如果将该模板添加到App.xaml文件中,还可以隐藏应用程序中可能存在的所有空ToolTip,这样会更好。
在App.xaml中,添加对Microsoft核心库的引用:
<Application
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
>

然后添加您的新的工具提示模板:
<Style x:Key="{x:Type ToolTip}" TargetType="ToolTip">
    <Setter Property="OverridesDefaultStyle" Value="true"/>
    <Setter Property="HasDropShadow" Value="True"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToolTip">
                <Border Name="Border" Background="#FFFFFF" BorderBrush="#000000" BorderThickness="1" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
                    <ContentPresenter Margin="4" HorizontalAlignment="Left" VerticalAlignment="Top" />
                </Border>
                <ControlTemplate.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>
                    <Trigger Property="HasDropShadow" Value="true">
                        <Setter TargetName="Border" Property="CornerRadius" Value="4"/>
                        <Setter TargetName="Border" Property="SnapsToDevicePixels" Value="true"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

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