it-swarm.com.de

Wie kann ich verhindern, dass WPF-Schaltflächen nach dem Klicken hervorgehoben werden?

Wenn eine Standard-WPF-Schaltfläche angeklickt wird, wird sie blau hervorgehoben (wahrscheinlich mit der blauen Farbe des jeweils festgelegten Windows-Designs) und bleibt hervorgehoben, bis Sie mit einem anderen Steuerelement interagieren. Für meine Anwendung ist es für den Benutzer verwirrend.

Gibt es eine einfache Möglichkeit, dies auszuschalten und den Button wieder in seinen normalen Stil zu bringen? Ich verwende .NET 4.

33
learner

Das Ergebnis ist ein Puls, der auf die Eingabe eines statischen Klicks gerichtet ist, und das Ergebnis ist ein altro-kontrollierter und ein fai-klick auf das Esso.

Der Modus in Windows zeigt an, dass die Steuerung auf den Eingabefokus (Menüpunkt für den Aero-Modus) gerichtet ist und dass die Anzeige blau ist.

Insbesondere ein Puls, der den Fokus auf die Eingabe legt und den Geschmack vorwegnimmtEnteril tasto "Spingi" quel pulsante. Ecco perché mantenere l'evidenziazione is molto importante, in modo che l'utente sappia cosa aspettarsi.

Die Lösung des Problems ist die Abnahme der Kontrolle und des Endergebnisses, die unmittelbar nach dem Abschluss des Vorgangs erfolgt. In questo modo, non verrà più automaticamente evidenziato e nessuna azione verrà automaticamente attivata quando l'utente preme il tastoEnterChiave. (Questo è il problema di usabilità reale che stai cercando di risolvere, anche se non lo conosci ancora cercando di digitare qualcosa.)

Puoi potrebbe hindert den Benutzer daran, den Fokus zu ändern Focusable proprietà su false, ma vorrei raccomandare contro questo. Es wird eine Frage gestellt, die nicht als Modalität für die "Premiere" zu verstehen ist und die nur für den Geschmack bestimmt ist. Die Anwendung kann mit sempre durchgeführt werden, um den Zugriff auf die bevorzugte Sono-Einstellung für die Verwendung mit der Maus zu ermöglichen.

49
Cody Gray

Versuchen Sie, Focusable auf false zu setzen. Die Schaltfläche kann angeklickt werden, bleibt jedoch nicht fokussiert.

10
HCL

Dies ist die Standardeinstellung für Aero-Schaltflächen, wenn sie den Fokus haben. Sie können entweder Focusable="False" festlegen oder einen benutzerdefinierten Stil verwenden, der ihn nicht anders darstellt, wenn die Schaltfläche den Fokus hat. So etwas wie:

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}" />

Sie müssen einen Verweis auf PresentationFramework.Aero.dll hinzufügen

2
CodeNaked

Das ist einfach der fokussierte Zustand. Um es auszuschalten, müssen Sie den Fokusstatus ändern. Es ist am einfachsten, wenn Sie Blend verwenden.

Ich empfehle nicht, Focusable auf false zu setzen, da dies die Verwendung der Tastatur beeinträchtigt

2
Erno de Weerd

Ich musste etwas ähnliches tun, aber im Code zur Laufzeit sah es so aus

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

Sie können sehen, dass ich die Zeile "" RenderMouseOver "kommentiere

Meine erste Hoffnung bestand in der Verwendung von FrameworkElementFactory, aber ich musste alle Standardvorlagen erstellen ... ALL by HAND! ;)
Verwenden 

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

Es gab mir die gewünschte Vorlage und das Entfernen des Render-Abschnitts war einfach.

0
Guish

Ich habe 2 Schritte Lösung gefunden. Die Lösung ist wenig lustig, aber funktioniert. Meine Referenzbeiträge sind;

Wie entferne ich den globalen FocusVisualStyle für alle Controls?

und C # WPF-Anwendung .NET 4.5 Mausposition festlegen

Ein DLL muss importiert werden, da WPF das Bewegen des Mauszeigers nicht direkt unterstützt.

  1. fügen Sie System.Runtime.InteropServices zum Namespace hinzu
  2. Fügen Sie dem Hauptfenster oder dem Code Ihres Fensters zwei Zeilen hinzu

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

  1. Fügen Sie diese 2 Zeilen zu Ihrem Klickereignis hinzu. SetCursorPos(0, 0); ButtonName.FocusVisualStyle = null;

Für mich geht das .

0
Özgür KAYA