wpf: comment afficher l'info-bulle lorsque le bouton est désactivé par commande?

162

J'essaie d'afficher une info-bulle quel que soit l'état des boutons, mais cela ne semble pas faire l'affaire:

<Button Command="{Binding Path=CommandExecuteAction}" 
        ToolTip="{Binding Path=Description}" ToolTipService.ShowOnDisabled="true"
        Style="{StaticResource toolbarButton}">
   <Image Source="{Binding Path=Icon}"></Image>
</Button>

Comment puis-je afficher l'info-bulle lorsque le bouton est désactivé en raison de command.CanExecute renvoie false?

Remarque:

ToolTipService.ShowOnDisabled = "true" fonctionne comme un charme. La raison pour laquelle cela n'a pas fonctionné dans mon exemple est que le style associé au bouton redéfinit le modèle de contrôle et a désactivé le test de positionnement sur le bouton lorsque le bouton était désactivé (IsHitTestVisible = false). La réactivation du test de positionnement dans le modèle de contrôle a fait apparaître l'info-bulle lorsque le bouton était désactivé.

Marius
la source
duplication possible de WPF Tooltip Visibility
OJ.
J'utilise ToolTipService.ShowOnDisabled, mais cela ne fonctionne pas.
Marius
1
Supprimez simplement cette question. J'ai fait un petit projet de test et ToolTipService.ShowOnDisabled fonctionne très bien.
Marius
15
Je suis content que cette question n'ait pas été supprimée. Il a répondu rapidement et avec précision à une question / problème que j'avais, ce qui est la raison exacte pour laquelle je viens à SO en premier lieu. Merci d'être Lazy (tm) Marius. :-)
Jere.Jones
Excusez-moi, y a-t-il un moyen de le montrer uniquement lorsqu'il est désactivé?
advapi

Réponses:

305

ToolTipService.ShowOnDisabled = "Vrai"

Kishore Kumar
la source
10
Référence MSDN: msdn.microsoft.com/en-us/library/…
David
3
Cela va dans la déclaration xaml de l'objet sur lequel l'info-bulle apparaîtra, c'est-à-dire:<Button ToolTipService.ShowOnDisabled="True">...
supporte gusmally Monica
26

C'est une bonne méthode à ajouter à votre code de démarrage

ToolTipService.ShowOnDisabledProperty.OverrideMetadata(
    typeof(Control),
    new FrameworkPropertyMetadata(true));
barbier sacha
la source
Pouvez-vous expliquer ce que cela fait? Dire que c'est une bonne méthode au démarrage n'explique pas.
Stealth Rabbi
Cela garantit que pour toute classe héritant de Control, des info-bulles sont affichées même si l'instance de Control est désactivée
sacha barber
3
Il est ironique que les utilisateurs aient le plus besoin de l'info-bulle lorsque le contrôle est désactivé, car ils veulent savoir pourquoi le contrôle est désactivé. Il s'agit d'un bon exemple d'une valeur par défaut dans WPF qui est incorrecte la grande majorité du temps. Cela vaut donc la peine de le changer.
Contango le
2

Rendre l'info-bulle visible pour TOUS les boutons et cases à cocher désactivés:

<Window.Resources>
    <Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}>
        <Setter Property="ToolTipService.ShowOnDisabled" Value="true"/>
    </Style>
    <Style TargetType="{x:Type CheckBox}" BasedOn="{StaticResource {x:Type CheckBox}}>
        <Setter Property="ToolTipService.ShowOnDisabled" Value="true"/>
    </Style>
</Window.Resources>

Le BasedOn=...empêche que vous perdiez tous les autres styles qui ont été appliqués à la case à cocher ou au bouton auparavant. Si vous n'utilisez aucun autre style pour le bouton ou la case à cocher, vous pouvez supprimer les BasedOn=..pièces

Blechdose
la source