добавление условной видимости в подсказку управления WPF - PullRequest
8 голосов
/ 18 августа 2010

Я хотел бы сделать подсказку для текстового блока условно видимой.

У меня есть всплывающая подсказка, определенная как:

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

Куда бы добавилось свойство видимости в этом определении?Кажется, мне не нравятся мои предположения.

Есть некоторые предложения по работе с видимостью сетки.проблема с этим подходом в том, чтобы сделать сетку невидимой, все равно будет отображаться пустое окно с подсказкой ... именно поэтому я пытаюсь контролировать видимость подсказки.

Ответы [ 9 ]

12 голосов
/ 18 августа 2010

Попробуй это. Это не оставит пустую рамку.

<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>
3 голосов
/ 18 августа 2011

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 голосов
/ 18 августа 2010

Вот, пожалуйста;

   <TextBlock Text="Dummy text">
        <TextBlock.ToolTip>
            <ToolTip Visibility="Collapsed">
                <TextBlock Text="Text tooltip"></TextBlock>
            </ToolTip>                
        </TextBlock.ToolTip>
    </TextBlock>
1 голос
/ 25 ноября 2018

Гораздо более простое решение, чем другие ответы:

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

где MakeToolTipVisible - ваша собственность.

1 голос
/ 16 июля 2012

Как насчет создания собственного стиля для всплывающей подсказки? Таким образом, вы можете повторно использовать одну и ту же функциональность в нескольких местах с минимальным кодом.

Добавьте это в ресурсный словарь и добавьте его туда, где хотите переопределить поведение всплывающей подсказки по умолчанию -

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

Надеюсь, это поможет .. Amit

1 голос
/ 15 августа 2011

Я понимаю, что это год, но вы можете сделать это в коде позади.

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

Я набираю это в основном, чтобы помочь всем, кто сталкивается сс этого момента.Полагаю, вы еще не застряли на этом год спустя, ОП.=)

0 голосов
/ 21 июля 2016

Пример: я хочу сохранить информацию о линии и добавить в свой холст

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);
0 голосов
/ 18 августа 2010

Если вы не хотите, чтобы во всплывающей подсказке отображалась пустая рамка.Вы должны создать отдельную всплывающую подсказку ControlTemplate со всей необходимой сеткой и текстовыми блоками и назначить ее шаблону всплывающей подсказки.Это может помочь вам решить проблему пустого фрейма.

0 голосов
/ 18 августа 2010

Вы должны установить видимость на сетке:

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


...

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