2 votes

Comment désactiver les infobulles pour l'ensemble de l'application ?

Est-il possible de désactiver les toooltips pour tous les contrôles (toujours ou en fonction d'une règle) sans définir TooltipService.IsEnabled sur chaque contrôle ? Passer par tous les éléments logiques prend trop de temps.

4voto

Ed Bayiates Points 6517

Il existe plusieurs moyens d'y parvenir. Marco Zhou en décrit deux dans cet affichage. Ces deux méthodes reposent sur la définition de TooltipService.IsEnabled à False pour un contrôle parent tel qu'une fenêtre. Apparemment, cette valeur est transmise par héritage à tous les enfants, de sorte que vous pouvez la définir juste là pour désactiver toutes les infobulles.

Vous pouvez également définir un style pour toutes vos infobulles, avec des liens vers une propriété qui les rendra invisibles ou désactivées quand vous le souhaitez.

EDIT

Ajout du code pour le rendre plus facile à comprendre :

Créez la propriété attachée ToolTipEnabled qui définit l'icône de l'outil. FrameworkPropertyMetadataOptions.Inherits afin qu'elle soit héritée par les enfants.

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

Vous pouvez utiliser cette propriété dans le XAML ou le codebehind comme ci-dessous :

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

Ou

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

        // You can programmatically disable tool tip here.
        this.SetValue(ToolTipBehavior.ToolTipEnabledProperty, false);
    }
}

2voto

MrSky Points 21

Essaie ça. Il masque toutes les infobulles.

<Style TargetType="{x:Type ToolTip}">
    <Setter Property="Visibility"
            Value="Collapsed" />
</Style>

1voto

ColinE Points 36907

Je ne connais pas de paramètre global, mais il existe un moyen simple de "visiter" tous les éléments de votre arborescence visuelle à l'aide de la fonction Linq-to-VisualTree J'ai écrit un utilitaire il y a quelque temps qui fournit une API de style Linq-to-XML pour l'arbre visuel.

Ce qui suit devrait faire l'affaire :

foreach(var element in window.Descendants())
  ToolttipService.SetIsEnabled(element, false);

1voto

Zahid Sattar Points 610

Placez ce style à un endroit où il est accessible dans toute l'application (un dictionnaire de ressources ou App.xaml), de sorte que vous n'aurez pas besoin de faire référence à ce style dans une quelconque zone de texte.

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

NOTE Il s'agit du style de boîte de texte par défaut généré par Expression blend auquel j'ai ajouté le déclencheur suivant qui active les infobulles lorsque la boîte de texte n'est pas vide et les désactive dans le cas contraire.

<Trigger Property="Text" Value="">
                            <Setter Property="ToolTipService.IsEnabled" Value="False"/>
                        </Trigger>

0voto

Alexey Turaev Points 114

Vous pouvez essayer d'utiliser

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X