C# WPF的XAML:当工具提示文本为空时隐藏工具提示弹出窗口

C# WPF的XAML:当工具提示文本为空时隐藏工具提示弹出窗口,c#,visual-studio,xaml,C#,Visual Studio,Xaml,我正在尝试使用Datagrid在WPF表单的单元格上设置工具提示。 这是可行的,但我不希望它在没有弹出文本显示的单元格中弹出 我在这里看到过类似的问题,但我一直无法让这些解决方案发挥作用 这是CellTemplate: <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Image Source="{Binding itemType}" VerticalAlignment="Center

我正在尝试使用Datagrid在WPF表单的单元格上设置工具提示。 这是可行的,但我不希望它在没有弹出文本显示的单元格中弹出

我在这里看到过类似的问题,但我一直无法让这些解决方案发挥作用

这是CellTemplate:

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <Image Source="{Binding itemType}" VerticalAlignment="Center">
            <ToolTipService.ToolTip>
                    <TextBlock Text="{Binding toolTipText}" />
            </ToolTipService.ToolTip>
        </Image>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<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>
我看到的是,当文本为空(好)时,它不会弹出工具提示,但当有文本时,它会弹出一个黑色矩形。
如果没有工具提示的样式设置,文本框会弹出OK(除了它也会弹出空白文本)

当我移除

Background="Black"

在边框样式上,我看不到任何弹出窗口。

您可以使用以下celltemplate使其更简单:

<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>

您可以尝试编辑工具提示模板,并添加触发器,以便在没有内容时折叠工具提示。如果将模板添加到App.xaml文件中,还可以隐藏应用程序中可能存在的所有空工具提示

在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>


我意识到您将textBlock作为工具提示的内容&然后将内容绑定到模板上textBlock的文本。我将在我的回答中添加一个更简单的方法。但是,无论是一列还是要重用工具提示?这里的一个重要关键是使用
可见性。折叠的
而不是
可见性。隐藏的
“隐藏”看起来更直观。为什么更好?这对我很有用!虽然我不完全理解为什么我以前的东西不起作用。区别在于可见性。隐藏隐藏控件,但保留它在布局中占据的空间。所以它呈现空白而不是控件。Visibility.Collapsed不呈现控件,也不保留空白。控件将占用的空间为“折叠”,因此得名。首先,因为当有文本(前景为黑色)和背景也为黑色时,您无法看到文本。其次,文本(字符串类型)绑定到内容(对象类型),而不使用转换器,因此内容中有文本,但无法获取它(没有转换器)。希望,现在很清楚:)
<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>