当文本为某个值时,WPF工具提示才显示

5

i am having the following code:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <Style x:Key="{x:Type ToolTip}" TargetType="{x:Type ToolTip}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ToolTip}">
                    <Border Background="Black">
                        <TextBlock  FontFamily="Tahoma" FontSize="11" Text="{TemplateBinding Content}" Foreground="WhiteSmoke" Padding="2" />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<StackPanel>
    <Label Content="Label 1" ToolTip="asd" />
    <Label Content="Label 2" ToolTip="" />
    <TextBlock Text="TextBlock 1" ToolTip="asd" />
    <TextBlock Text="TextBlock 2" ToolTip="" />
    <Button Content="Button 1" ToolTip="asd" />
    <Button Content="Button 2" ToolTip="" />
</StackPanel>

现在,您可以通过测试发现,当鼠标悬停在Label 2、Textblock 2和Button 2上时,仍会显示提示框。 我希望如果Tooltip为空或null,则不会触发它的显示。我知道我可以简单地从XAML中删除它,但我正在这里尝试一些不同的方法。

我已经尝试添加一个触发器来检查value =“”和null,并在触发器内将模板设置为null,但它们都没有起作用。

如果您中的一些专家能够为此提供一些帮助,我将非常高兴。

3个回答

13

当使用DataTrigger可以达到同样效果时,转换器可能有些过度。以下是您发布的样式,经过一些清理和必要的触发器处理。请注意以下内容:

  1. 我通常设置默认样式,最终会被触发器覆盖。在本例中,默认样式为Visibility=Visible
  2. 有两个触发器。一个用于内容为空时,另一个用于内容为null时。

XAML

<Style TargetType="ToolTip">
    <Setter Property="Visibility" Value="Visible" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToolTip">
                <Border Background="Black">
                    <TextBlock FontFamily="Tahoma"
                               FontSize="11"
                               Foreground="WhiteSmoke"
                               Padding="2"
                               Text="{TemplateBinding Content}" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Content}" Value="{x:Null}">
            <Setter Property="Visibility" Value="Collapsed" />
        </DataTrigger>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Content}" Value="">
            <Setter Property="Visibility" Value="Collapsed" />
        </DataTrigger>
    </Style.Triggers>
</Style>

虽然使用触发器也可以完成相同的任务,但是他尝试了触发器却无法使其正常工作(如他在帖子中所述),这就是为什么我使用了IValueConverter。 - prthrokz
@prthrokz - OP从未发布触发器代码,因此我们无法验证该代码。我发布的触发器可以正常工作,无需转换器。 - Metro Smurf
感谢@Metro Smurf提供的解决方案。我在两个地方都错了。首先是绑定,其次是在此类型中,Tooltip属性设置为Textblock,因此检查null或empty无效。因此,我修改了上面的代码,并仅检查字符串类型,如果是,则返回Visible,否则返回Collapsed。 - Walter Boss

6
你可以考虑使用IValueConverter来显示/隐藏工具提示边框。将以下类添加到您的项目中:
class BorderVisibilitySetter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
       //check if the control's content property is null or empty        
        if(value == null || value.ToString() == string.Empty)
            return Visibility.Collapsed;
        else
            return Visibility.Visible;
    }

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

然后修改您的 XAML 如下:

<src:BorderVisibilitySetter x:Key="BorderVisible" />
    <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 BorderVisible}}" >
                        <TextBlock  FontFamily="Tahoma" FontSize="11" Text="{TemplateBinding Content}" Foreground="WhiteSmoke" Padding="2" />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

0

我的解决方案将具有以下功能:

  1. 如果文本块中有文本,将显示工具提示
  2. 工具提示文本与文本块文本相同
  3. 工具提示前景色与文本块前景色相同

Xaml 代码:

<TextBlock Name="TxtBlockLicenseInfo" Height="35"  ToolTipService.ShowDuration="200000" TextTrimming="CharacterEllipsis">
     <TextBlock.ToolTip>
        <ToolTip DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}" 
                                    Visibility="{Binding Text,Converter={StaticResource TextToTooltipVisibilityConverter}}" >
                <StackPanel>
                      <Label Content="{Binding Text}" Foreground="{Binding Foreground}" >
                      </Label>
                </StackPanel>
         </ToolTip>
      </TextBlock.ToolTip>
</TextBlock>

同时将转换器包含在Xaml资源中

<UserControl.Resources>
    <local:LicenseInformationToTooltipVisibilityConverter x:Key="LicenseInformationToTooltipVisibilityConverter" />
</UserControl.Resources>

Xaml.Cs 代码编写转换器

public class TextToTooltipVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if ((value.ToString().Equals(string.Empty)))
        {
            return Visibility.Collapsed;
        }
        else return Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return Visibility.Visible;
    }
}

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