Как отключить подсказки для всего приложения - PullRequest
2 голосов
/ 08 августа 2011

Можно ли отключить тултипы для всех элементов управления (всегда или на основе какого-либо правила) без установки TooltipService.IsEnabled для каждого элемента управления?Я имею в виду, что прохождение всех логических элементов занимает слишком много времени.

Ответы [ 6 ]

4 голосов
/ 08 августа 2011

Есть несколько способов, которые вы должны использовать для достижения этой цели. Марко Чжоу обрисовал в общих чертах два из них в этой публикации. , оба эти метода основаны на установке TooltipService.IsEnabled в False для родительского элемента управления, такого как Window. Очевидно, он наследует все дочерние элементы, поэтому вы можете установить его там, чтобы отключить все всплывающие подсказки.

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

EDIT

Добавление кода для облегчения понимания:

Создайте вложенное свойство ToolTipEnabled, которое устанавливает FrameworkPropertyMetadataOptions.Inherits так, чтобы оно было унаследовано дочерними элементами.

public class ToolTipBehavior
{
    public static Boolean GetIsToolTipEnabled(FrameworkElement obj)
    {
        return (Boolean)obj.GetValue(ToolTipEnabledProperty);
    }

    public static void SetToolTipEnabled(FrameworkElement obj, Boolean value)
    {
        obj.SetValue(ToolTipEnabledProperty, value);
    }

    public static readonly DependencyProperty ToolTipEnabledProperty = DependencyProperty.RegisterAttached(
        "IsToolTipEnabled",
        typeof(Boolean),
        typeof(ToolTipBehavior),
        new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.Inherits, (sender, e) => 
        {
            FrameworkElement element = sender as FrameworkElement;
            if (element != null)
            {
                element.SetValue(ToolTipService.IsEnabledProperty, e.NewValue);
            }
        }));
}

Вы можете использовать это свойство в XAML или в коде, как показано ниже:

<Window x:Class="AnswerHarness.ToggleToolTipsDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:cc="clr-namespace:AnswerHarness"
    Title="ToggleToolTipsDemo" Height="300" Width="300" Name="window">
  <StackPanel>
    <CheckBox IsChecked="{Binding Path=(cc:ToolTipBehavior.IsToolTipEnabled), ElementName=window}" Content="Enable ToolTip"/>
    <Border BorderBrush="Green" BorderThickness="1" Background="Yellow" ToolTip="Border">
      <StackPanel>
        <Button Width="120" Height="30" Content="Button1" ToolTip="Button1"/>
        <Button Width="120" Height="30" Content="Button2" ToolTip="Button2"/>
        <Button Width="120" Height="30" Content="Button3" ToolTip="Button3"/>
      </StackPanel>
    </Border>
  </StackPanel>
</Window>

Или

public partial class ToggleToolTipsDemo : Window
{
    public ToggleToolTipsDemo()
    {
        InitializeComponent();

        // You can programmatically disable tool tip here.
        this.SetValue(ToolTipBehavior.ToolTipEnabledProperty, false);
    }
}
2 голосов
/ 19 февраля 2014

Попробуй это.Он скрывает все всплывающие подсказки.

<Style TargetType="{x:Type ToolTip}">
    <Setter Property="Visibility"
            Value="Collapsed" />
</Style>
1 голос
/ 08 августа 2011

Поместите этот стиль там, где он доступен во всем приложении (resourcedictionary или App.xaml), чтобы вам не нужно было ссылаться на этот стиль в любом текстовом поле.

<Style BasedOn="{x:Null}" TargetType="{x:Type TextBox}">
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
        <Setter Property="BorderBrush" Value="{StaticResource TextBoxBorder}"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Padding" Value="1"/>
        <Setter Property="AllowDrop" Value="true"/>
        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
        <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Microsoft_Windows_Themes:ListBoxChrome x:Name="Bd" ToolTipService.IsEnabled="False" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" SnapsToDevicePixels="true">
                        <ScrollViewer ToolTipService.IsEnabled="False" x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </Microsoft_Windows_Themes:ListBoxChrome>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                        </Trigger>
                        <Trigger Property="Text" Value="">
                            <Setter Property="ToolTipService.IsEnabled" Value="False"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

ПРИМЕЧАНИЕ Это стиль текстового поля по умолчанию, созданный смесью Expression, к которому я добавил следующий триггер, который включает всплывающие подсказки, когда текстовое поле не пустое, и отключает их в противном случае

<Trigger Property="Text" Value="">
                            <Setter Property="ToolTipService.IsEnabled" Value="False"/>
                        </Trigger>
1 голос
/ 08 августа 2011

Я не знаю каких-либо глобальных настроек, но есть простой способ "посетить" все элементы вашего визуального дерева, используя Linq-to-VisualTree , утилита, которую я написал некоторое время обратно, что предоставляет API стиля Linq-to-XML для визуального дерева.

Следующее должно сделать трюк:

foreach(var element in window.Descendants())
  ToolttipService.SetIsEnabled(element, false);
0 голосов
/ 13 марта 2014

У меня нет ответа для обработки всего приложения в одном утверждении, но я смог централизовать ряд специфичных для пользовательского интерфейса параметров в общем базовом классе, а затем создать приложения, которые получены из этого базового классаи наследовать централизованные настройки.Я должен отметить, что есть некоторые дополнительные сантехника , которые необходимо добавить в базовый класс для поддержки MVVM, как показано ниже:

public class MyMainWindowBaseClass : Window, INotifyPropertyChanged
{
    ...whatever unrelated stuff you need in your class here...

    private int m_toolTipDuration = 3000;   // Default to 3 seconds

    public int MyToolTipDuration
    {
        get { return m_toolTipDuration; }
        set
        {
            if (m_toolTipDuration != value)
            {
                bool transition = (value == 0 || m_toolTipDuration == 0);

                m_toolTipDuration = value;
                NotifyPropertyChanged("MyToolTipDuration");

                if (transition)
                {
                    NotifyPropertyChanged("MyToolTipEnabled");
                }
            }
        }
    }
    public bool MyToolTipEnabled
    {
        get { return (m_toolTipDuration > 0);  }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    ... whatever variables, properties, methods, etc., you need here...

    ///-----------------------------------------------------------------------------
    /// <summary>
    /// Fires property-changed event notification
    /// </summary>
    /// <param name="propertyName">The name of the property that changed</param>
    ///-----------------------------------------------------------------------------
    public void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

Код XAML выглядит следующим образом:

    <Button Command="{Binding StartCommand}"
            Content="Start"
            FontWeight="Bold"
            Height="Auto"
            HorizontalAlignment="Left"
            Margin="20,40,0,0"
            Name="ui_StartButton"
            ToolTip="Click this button to begin processing."
            ToolTipService.IsEnabled="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=MyToolTipEnabled}"
            ToolTipService.ShowDuration="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=MyToolTipDuration}"
            VerticalAlignment="Top"
            Width="90"/>

С важными привязками, связанными с ToolTipService.IsEnabled и ToolTipService.ShowDuration .

Вы можете видеть, что если MyToolTipDuration установлен в ноль, MyToolTipEnabled вернет false, и это отключит всплывающую подсказку.В первой попытке я попытался просто установить MyToolTipDuration на ноль, не используя ToolTipService.IsEnabled = в сочетании со свойством MyToolTipEnabled , но все, что было выполнено, мигало,едва читаемые всплывающие подсказки, которые появляются и исчезают.

В целом, для меня это работало довольно хорошо (ymmv), хотя не так, как единственная настройка или один вызов, который бы обрабатывал все приложение и обходил необходимость в распределенииэти привязки к каждому элементу с всплывающей подсказкой, которую я хотел бы поддерживать возможностью отключения.Ну да ладно, когда в Риме ....

В любом случае, надеюсь, кто-то найдет это полезным.

0 голосов
/ 07 февраля 2013

Вы можете попробовать использовать

ToolTipService.IsOpenProperty.OverrideMetadata(typeof(DependencyObject),new PropertyMetadata(false));
...