【问题标题】:adding conditional visibility to WPF control ToolTip向 WPF 控件工具提示添加条件可见性
【发布时间】:2011-03-31 13:54:58
【问题描述】:

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

我将工具提示定义为:

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

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

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

【问题讨论】:

    标签: wpf wpf-controls


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      带有工具提示的文本块:

      <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。
      【解决方案3】:

      给你;

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

      【讨论】:

      • 我想控制工具提示的可见性。如果我让网格不可见,它仍然会显示空的工具提示框。
      • 像“”一样在TextBlock中试试
      • 我不想让文本块不可见。只是工具提示
      • 这不是合法的 XAML ...您不能在 &lt;ToolTip&gt; 上放置属性。正确的解决方案是&lt;TextBlock Text="Dummy text" ToolTipService.IsEnabled="{Binding ShowMyToolTip}"&gt;
      【解决方案4】:

      我知道这已经有一年了,但您可以在代码隐藏中完成此操作。

      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 = "{Binding showControl}"
      

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

      【讨论】:

      • 这就是 ToolTipService.IsEnabled 的用途......只需绑定它。无需代码隐藏或任何其他恶作剧。
      【解决方案5】:

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

      将此添加到资源字典并将其包含在您想要覆盖默认工具提示行为的任何位置 -

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

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

      【讨论】:

      • OP 的 ToolTip 是一个网格,而不是一个字符串。
      【解决方案6】:

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

      <Window.Resources>
          <BooleanToVisibilityConverter x:Key="visibilityConverter" />
      </Window.Resources>
      
      
      ...
      
      <Grid Visibility="{Binding IsToolTipVisible, Converter={StaticResource visibilityConverter}}>
      ...
      </Grid>
      

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • +1 似乎比没有模板和冗余更好的方法。
        • 没必要;只需绑定 TextBlock(或其他控件)的 ToolTipService.IsEnabled 属性。
        【解决方案8】:

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

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

        MakeToolTipVisible 是您的财产。

        【讨论】:

          【解决方案9】:

          示例:我想存储有关线条的信息并添加到我的画布中

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

          【讨论】:

          • 这不能回答问题。
          猜你喜欢
          • 2011-03-10
          • 2010-11-23
          • 1970-01-01
          • 2011-10-12
          • 1970-01-01
          • 2019-12-26
          • 2021-04-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多