2010-08-18 73 views
8

我想使textblock工具提示有条件可见。向WPF控件添加条件可见性工具提示

我有提示定义为:

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

哪里会visibility属性在这个定义去?它似乎并不喜欢我的任何猜测。

有一些建议只是使用网格可视性。该方法的问题是使网格隐形仍然会显示空的工具提示框..这就是为什么我试图控制工具提示可见性。

回答

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

您应该设置网格上的知名度:

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


... 

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

在这里你去;

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

我想控制工具提示可见性。如果我让网格隐形,它仍然会显示空的工具提示框。 – 2010-08-18 14:00:16

+1

在TextBlock中尝试它,如“” – NetSide 2010-08-18 14:02:59

+0

我不想让文本块不可见。只是工具提示 – 2010-08-18 14:11:03

0

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

+0

+1似乎比没有模板和冗余的方式更好。 – 2012-07-16 15:17:25

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。 =)

2

其工具提示的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 
} 
1

有关创建自定义样式如何工具提示?这样,您可以在几个地方以最少的代码重新使用相同的功能。

一下添加到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; 
     } 
    } 

希望这有助于.. 阿米特

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