将条件可见性添加到WPF控件ToolTip

9
我希望能够有条件地显示文本块工具提示。
我已经定义了工具提示如下:
<TextBlock>
    <TextBlock.ToolTip>
        <Grid>...</Grid>
    </TextBlock.ToolTip>
</TextBlock>

在那个定义中,可见性属性应该放在哪里?我的猜测似乎都不行。建议只使用网格可见性,但这种方法的问题是使网格不可见仍会显示空的工具提示框..这就是为什么我试图控制工具提示可见性的原因。
9个回答

16

试试这个。它不会留下空框架。

<TextBlock Text="test">
        <TextBlock.ToolTip>
            <ToolTip Visibility="Visible">
                Hello
            </ToolTip>
        </TextBlock.ToolTip>
    </TextBlock>

<TextBlock Text="test">
        <TextBlock.ToolTip>
            <ToolTip Visibility="Hidden">
                Hello
            </ToolTip>
        </TextBlock.ToolTip>
    </TextBlock>

5

带有工具提示的TextBlock:

<TextBlock Text="{Binding Path=TextBoxText}">
    <TextBlock.ToolTip>
        <ToolTip Visibility="{Binding Path=ToolTipText, Converter={StaticResource StringToVisibilityConverter}}"> 
            <Grid><TextBlock Text="{Binding Path=ToolTipText}" /></Grid>
        </ToolTip>
    </TextBlock.ToolTip>
</TextBlock>

您绑定到 TextBlock 的对象:
public class TextBoxBindingObject
{
   public string TextBoxText{ get; set; }
   public string ToolTipText{ get; set; }
}

转换器:
[ValueConversion(typeof(string), typeof(Visibility))]
public class StringToVisibilityConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if(value is string)
        {
            var stringValue = value as string;

            if(!String.IsNullOrEmpty(stringValue))
                return Visibility.Visible;
        }

        return Visibility.Hidden;
    }

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

    #endregion
}

OP的ToolTip是一个网格,所以这与此无关。控制ToolTip可见性的正确方法是通过ToolTipService.IsEnabled。 - Jim Balter

4

给你:

   <TextBlock Text="Dummy text">
        <TextBlock.ToolTip>
            <ToolTip Visibility="Collapsed">
                <TextBlock Text="Text tooltip"></TextBlock>
            </ToolTip>                
        </TextBlock.ToolTip>
    </TextBlock>

我想控制工具提示的可见性。如果我将网格设置为不可见,它仍会显示空的工具提示框架。 - Sonic Soul
1
尝试在 TextBlock 中使用“<TextBlock Visibility=" Visible">”进行测试。 - NetSide
我不想让文本块消失,只想让工具提示消失。 - Sonic Soul
这不是合法的 XAML ... 你不能在 <ToolTip> 上放置一个属性。正确的解决方案是 <TextBlock Text="Dummy text" ToolTipService.IsEnabled="{Binding ShowMyToolTip}"> - Jim Balter

2

我知道这篇文章已经有一年了,但你可以在代码后台实现这个功能。

private void control_ToolTipOpening(object sender, ToolTipEventArgs e)
{

    if (condition)
        e.Handled = true;
}

如果您想在这里设置属性,可以这样做,并将其绑定到可见性。不要忘记在窗口上实现INotifyPropertyChanged接口。
例如:
private void control_ToolTipOpening(object sender, ToolTipEventArgs e)
{

    if (condition)
    {
        showControl=true;
        e.Handled = true;   
    }
}

    public Visibility showControl
    {
      get
      {
        return _showControl;
      }
      set
      {
        _showControl = value;
        NotifyPropertyChanged("showControl");
      }
    }

然后将其绑定到“visibility”属性上。
Visibility = "{Binding showControl}"

我主要是为了帮助从现在开始遇到这个问题的任何人。猜测一年后的现在,楼主应该已经解决了这个问题。=)


这就是ToolTipService.IsEnabled的作用...只需绑定即可。不需要代码后台或任何其他花哨的东西。 - Jim Balter

2
如何为工具提示创建自定义样式?这样,您可以在多个位置重复使用相同的功能,而代码量最小。
将以下内容添加到资源字典中,并在需要覆盖默认工具提示行为的任何位置包含它 -
<Style TargetType="ToolTip" x:Key="{x:Type ToolTip}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=Content, 
                                           RelativeSource={RelativeSource Self}, 
                                           Converter={local:ToolTipContentConverter}}" 
                         Value="">
                <Setter Property="Visibility" Value="Hidden"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

在转换器之后 -

 [ValueConversion(typeof(object), typeof(string))]
    public class ToolTipContentConverter : MarkupExtension, IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value ?? string.Empty;
        }

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

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return this;
        }
    }

希望这能帮到您... Amit

OP的工具提示是一个网格,而不是一个字符串。 - Jim Balter

1
你应该设置网格的可见性:
<Window.Resources>
    <BooleanToVisibilityConverter x:Key="visibilityConverter" />
</Window.Resources>


...

<Grid Visibility="{Binding IsToolTipVisible, Converter={StaticResource visibilityConverter}}>
...
</Grid>

1
如果您不想让工具提示显示空框架,您应该创建一个单独的工具提示控件模板,其中包含所有所需的网格和文本块,并将其分配给工具提示模板。这可以帮助您解决空框架问题。

+1 似乎比不使用模板并存在冗余的方法更好。 - Amit Sharma
不需要那样做;只需绑定TextBlock(或其他控件)的ToolTipService.IsEnabled属性即可。 - Jim Balter

1
一个比其他答案更简单的解决方案:

<TextBlock ToolTipService.IsEnabled="{Binding MakeToolTipVisible}">
    <TextBlock.ToolTip>
        <Grid>...</Grid>
    </TextBlock.ToolTip>
</TextBlock>

其中 MakeToolTipVisible 是您的属性。


0

例子:我想要储存线条的信息并添加到我的画布上。

Line line = new Line();
line.X1 = 100;
line.Y1 = 100;
line.X2 = 500;
line.Y2 = 100;
line.Stroke = Brushes.Red;
line.StrokeThickness = 1;
line.ToolTip = new ToolTip { Content = "This is a line",Visibility= Visibility.Collapsed };
canvas.Children.Add(line);

这并没有回答问题。 - Jim Balter

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