代码之家  ›  专栏  ›  技术社区  ›  Sonic Soul

向WPF控件工具提示添加条件可见性

  •  8
  • Sonic Soul  · 技术社区  · 14 年前

    我想有条件地使textblock工具提示可见。

    我将工具提示定义为:

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

    在这个定义中,可见性属性将何去何从?我的猜测似乎一点也不像。

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

    9 回复  |  直到 14 年前
        1
  •  15
  •   Crispy    14 年前

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

    <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
  •  4
  •   NetSide    14 年前

       <TextBlock Text="Dummy text">
            <TextBlock.ToolTip>
                <ToolTip Visibility="Collapsed">
                    <TextBlock Text="Text tooltip"></TextBlock>
                </ToolTip>                
            </TextBlock.ToolTip>
        </TextBlock>
    
        3
  •  4
  •   Ryan Spears    13 年前

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

    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
    }
    
        4
  •  2
  •   Yatrix    13 年前

    我知道这是一年前的事了,但你可以在代码里完成。

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

        5
  •  2
  •   Amit Sharma    12 年前

    将其添加到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;
            }
        }
    

    希望这有帮助。。

        6
  •  1
  •   Thomas Levesque    14 年前

    应设置栅格上的可见性:

    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="visibilityConverter" />
    </Window.Resources>
    
    
    ...
    
    <Grid Visibility="{Binding IsToolTipVisible, Converter={StaticResource visibilityConverter}}>
    ...
    </Grid>
    
        7
  •  1
  •   Prince Ashitaka    14 年前

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

        8
  •  1
  •   Jim Balter    5 年前

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

    哪里 MakeToolTipVisible 是你的财产。

        9
  •  0
  •   Manh Tuyen    8 年前

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

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