web-dev-qa-db-fra.com

Comment empêcher les boutons WPF de rester en surbrillance après un clic?

Lorsque vous cliquez sur un bouton WPF standard, il est mis en surbrillance en bleu (en utilisant probablement la couleur bleue du thème Windows défini) et reste en surbrillance jusqu'à ce que vous interagissiez avec un autre contrôle. Pour mon application, c'est déroutant pour l'utilisateur.

Existe-t-il un moyen simple de désactiver cette option et de ramener le bouton à son style habituel? J'utilise .NET 4.

33
learner

Quello a succédé à la pulsation et à la focalisation de la saisie de données vidéo, il est désormais possible de modifier le contrôle de la qualité.

Il n'y a aucune modification dans les fenêtres indiquant que le contrôle est défini sur les entrées (toutes les informations sur le produit) doivent être conservées clairement.

En particulier par un contrôle de pulsation, quand il a le focus de saisie, exemple avant le goûtEnteril tasto "Spingi" quel pulsante. Il est important de savoir comment l'évènement est important, dans le style actuel.

La solution migraine est impénétrable pour l'atteinte d'un contrôle diversifié pour le contrôle immédiat de l'efficacité totale du clic sur le bouton de la souris. Dans le cadre d'une recherche automatique, assurez-vous que tout se passe bien si vous voulez que tout le monde se prépare.EnterChiave. Si vous avez des problèmes d'utilisation , vous devez vous enregistrer dans les deux cas. quand l'utente est en cours d'effet, cercando di digitare qualcosa.)

Puoi potrebbe empêche le contrôle de la mise au point sur le focus Focusable proprietà su faux, il y a des raisons de le faire. Une fois que vous avez terminé, vous n'êtes pas à la recherche d'un nouveau titre pour le premier rôle que vous voulez jouer seul. Les applications dont vous avez besoin sempère il est important de choisir votre préférence de souris.

49
Cody Gray

Essayez de définir Focusable sur false. Le bouton sera cliquable mais ne restera pas concentré.

10
HCL

C'est l'aspect par défaut des boutons Aero lorsqu'ils ont le focus. Vous pouvez définir Focusable="False" ou utiliser un style personnalisé qui ne le restitue pas différemment lorsque le bouton a le focus. Quelque chose comme:

xmlns:theme="clr-namespace:Microsoft.Windows.Themes;Assembly=PresentationFramework.Aero"
<Style x:Key="BaseButtonStyle" TargetType="{x:Type ButtonBase}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ButtonBase}">
                <theme:ButtonChrome Name="Chrome" Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}" RenderDefaulted="{TemplateBinding Button.IsDefaulted}"
                        RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}"
                        SnapsToDevicePixels="true">
                    <ContentPresenter Margin="{TemplateBinding Padding}"
                            VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True"
                            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                </theme:ButtonChrome>
                <ControlTemplate.Triggers>
                    <!--
                    Do not show blue when focused
                    <Trigger Property="IsKeyboardFocused" Value="true">
                        <Setter TargetName="Chrome" Property="RenderDefaulted" Value="true" />
                    </Trigger>-->
                    <Trigger Property="ToggleButton.IsChecked" Value="true">
                        <Setter TargetName="Chrome" Property="RenderPressed" Value="true" />
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="#ADADAD" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="{x:Type ToggleButton}" BasedOn="{StaticResource BaseButtonStyle}" TargetType="{x:Type ToggleButton}" />
<Style x:Key="{x:Type RepeatButton}" BasedOn="{StaticResource BaseButtonStyle}" TargetType="{x:Type RepeatButton}" />
<Style x:Key="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}" TargetType="{x:Type Button}" />

Vous devez ajouter une référence à PresentationFramework.Aero.dll.

2
CodeNaked

C'est simplement l'état ciblé. Pour l'éteindre, vous devrez changer l'état ciblé. C'est plus facile en utilisant Blend.

Je ne recommande pas de définir Focusable sur false car cela interfère avec l'utilisation du clavier

2
Erno de Weerd

J'avais besoin de faire quelque chose de similaire, mais dans le code à l'exécution, il ressemblait à ceci

//You can get this XAML by using System.Windows.Markup.XamlWriter.Save(yourButton.Template)";
             const string controlXaml = "<ControlTemplate TargetType=\"ButtonBase\" " +
                                    "xmlns=\"http://schemas.Microsoft.com/winfx/2006/xaml/presentation\" " +
                                    "xmlns:s=\"clr-namespace:System;Assembly=mscorlib\" " +
                                    "xmlns:mwt=\"clr-namespace:Microsoft.Windows.Themes;Assembly=PresentationFramework.Aero\">" +
                                    "<mwt:ButtonChrome Background=\"{TemplateBinding Panel.Background}\" " +
                                    "BorderBrush=\"{TemplateBinding Border.BorderBrush}\" " +
                                    "RenderDefaulted=\"{TemplateBinding Button.IsDefaulted}\" " +
                                    //"RenderMouseOver=\"{TemplateBinding UIElement.IsMouseOver}\" " +
                                    "RenderPressed=\"{TemplateBinding ButtonBase.IsPressed}\" Name=\"Chrome\" SnapsToDevicePixels=\"True\">" +
                                    "<ContentPresenter RecognizesAccessKey=\"True\" " +
                                    "Content=\"{TemplateBinding ContentControl.Content}\" " +
                                    "ContentTemplate=\"{TemplateBinding ContentControl.ContentTemplate}\" " +
                                    "ContentStringFormat=\"{TemplateBinding ContentControl.ContentStringFormat}\" " +
                                    "Margin=\"{TemplateBinding Control.Padding}\" " +
                                    "HorizontalAlignment=\"{TemplateBinding Control.HorizontalContentAlignment}\" " +
                                    "VerticalAlignment=\"{TemplateBinding Control.VerticalContentAlignment}\" " +
                                    "SnapsToDevicePixels=\"{TemplateBinding UIElement.SnapsToDevicePixels}\" /></mwt:ButtonChrome>" +
                                    "<ControlTemplate.Triggers>" +
                                    "<Trigger Property=\"UIElement.IsKeyboardFocused\">" +
                                    "<Setter Property=\"mwt:ButtonChrome.RenderDefaulted\" TargetName=\"Chrome\"><Setter.Value><s:Boolean>True</s:Boolean></Setter.Value></Setter>" +
                                    "<Trigger.Value><s:Boolean>True</s:Boolean></Trigger.Value></Trigger>" +
                                    "<Trigger Property=\"ToggleButton.IsChecked\">" +
                                    "<Setter Property=\"mwt:ButtonChrome.RenderPressed\" TargetName=\"Chrome\"><Setter.Value><s:Boolean>True</s:Boolean></Setter.Value></Setter>" +
                                    "<Trigger.Value><s:Boolean>True</s:Boolean></Trigger.Value></Trigger>" +
                                    "<Trigger Property=\"UIElement.IsEnabled\"><Setter Property=\"TextElement.Foreground\"><Setter.Value><SolidColorBrush>#FFADADAD</SolidColorBrush></Setter.Value></Setter>" +
                                    "<Trigger.Value><s:Boolean>False</s:Boolean></Trigger.Value></Trigger></ControlTemplate.Triggers>" +
                                    "</ControlTemplate>";

        var xamlStream = new MemoryStream(System.Text.Encoding.Default.GetBytes(controlXaml));
        var _buttonControlTemplate = (ControlTemplate)System.Windows.Markup.XamlReader.Load(xamlStream);
        var yourButton = new Button() { Template = _buttonControlTemplate };

Vous pouvez voir que je commente la ligne "" RenderMouseOver "

Mon premier espoir était d'utiliser FrameworkElementFactory, mais je devais créer tout le modèle par défaut. TOUT À LA MAIN! ;)
En utilisant 

System.Windows.Markup.XamlWriter.Save(myButton.Template)

Il me donnait le modèle que je voulais et puis supprimer la section Render était facile.

0
Guish

J'ai trouvé la solution en 2 étapes. La solution est peu drôle mais fonctionne. Mes messages de référence sont;

Comment supprimer Global FocusVisualStyle à tous les contrôles?

et application C # WPF .NET 4.5 Définir la position de la souris

Un DLL doit être importé, car WPF ne prend pas directement en charge le déplacement du curseur de la souris.

  1. ajouter System.Runtime.InteropServices à l'espace de noms
  2. Ajoutez deux lignes à MainWindow ou quel que soit le code de votre fenêtre

[DllImport("User32.dll")] private static extern bool SetCursorPos(int X, int Y);

  1. Ajoutez ces 2 lignes à votre événement click. SetCursorPos(0, 0); ButtonName.FocusVisualStyle = null;

Ça marche pour moi .

0
Özgür KAYA