为WPF控件ToolTip添加条件可见性

时间:2010-08-18 13:51:48

标签: wpf wpf-controls

我想使文本块工具提示有条件地可见。

我将工具提示定义为:

<TextBlock>
    <TextBlock.ToolTip>
        <Grid>...</Grid>
    </TextBlock.ToolTip>
</TextBlock>

可见性属性在该定义中的位置?它似乎不喜欢我的任何猜测。

有一些建议只是使用网格可见性。这种方法的问题是使网格不可见仍然会显示空的工具提示框..这就是我试图控制工具提示可见性的原因。

9 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:3)

你走了;

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

答案 2 :(得分:3)

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
}

答案 3 :(得分:1)

我意识到这已经有一年了,但你可以在代码隐藏中实现这一目标。

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

我正在输入这个主要是为了帮助从这一点开始遇到这个问题的任何人。我猜你一年后还没有坚持这个,OP。 =)

答案 4 :(得分:1)

如何为Tooltip创建自定义样式?这样,您可以使用最少的代码在多个位置重复使用相同的功能。

将此添加到resourcedictionary并将其包含在您想要覆盖默认工具提示行为的位置 -

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

希望这会有所帮助.. 阿米特

答案 5 :(得分:1)

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

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

其中MakeToolTipVisible是您的财产。

答案 6 :(得分:0)

您应该在网格上设置可见性:

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="visibilityConverter" />
</Window.Resources>


...

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

答案 7 :(得分:0)

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

答案 8 :(得分: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);