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.
Réponses
Trop de publicités?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);
}
}
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);
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>
- Réponses précédentes
- Plus de réponses