2010-08-18 56 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);