¿Cómo evito que los botones WPF permanezcan resaltados después de hacer clic?

Cuando se hace clic en un botón WPF estándar, se resalta en azul (probablemente usando el color azul de cualquier tema de Windows establecido), y permanece resaltado hasta que interactúe con cualquier otro control. Para mi aplicación, es confuso para el usuario.

¿Hay una forma sencilla de desactivar esto y volver a poner el botón en su estilo normal? Estoy usando .NET 4.

Lo que sucede es que el botón acepta el foco de entrada después de hacer clic, al igual que cualquier otro control lo hace al hacer clic en él.

Y la forma en que Windows indica que un control tiene el foco de entrada (al menos bajo el tema Aero) es con un resaltado azul sutil.

En particular, para un control de botón, cuando tiene el foco de entrada, simplemente presionando la tecla Intro “presionará” ese botón. Es por eso que mantener lo más destacado es muy importante, para que el usuario sepa qué esperar.

La mejor solución es establecer el enfoque en un control diferente en su ventana inmediatamente después de que el usuario haya hecho clic en el botón. De esa manera, ya no se resaltará automáticamente y no se activará automáticamente ninguna acción cuando el usuario presione la tecla Intro . (Este es el verdadero problema de usabilidad que intentas resolver, incluso si todavía no lo sabes. No hay nada más confuso que hacer clic en un botón cuando el usuario intenta escribir algo).

Podría evitar que el botón obtenga el foco por completo estableciendo su propiedad Focusable en falso, pero lo recomendaría mucho. Una vez que hayas hecho esto, no habrá forma de que el usuario “presione” el botón utilizando solo el teclado. Las aplicaciones bien diseñadas siempre deben ser accesibles a los usuarios que prefieren no hacerlo o que no pueden usar el mouse.

Trate de establecer Focusable en falso. Se podrá hacer clic en el botón, pero no se mantendrá enfocado.

Ese es simplemente el estado enfocado. Para apagarlo deberás cambiar el estado enfocado. Es más fácil usando Blend.

No recomiendo configurar Focusable en falso porque interfiere con el uso del teclado

Este es el aspecto predeterminado para los botones Aero cuando tienen enfoque. Puede establecer Focusable="False" o usar un estilo personalizado, que no lo represente de manera diferente cuando el botón tiene el foco. Algo como:

 xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" 
     

Necesitaría agregar una referencia a PresentationFramework.Aero.dll

Necesitaba hacer algo similar, pero en código en tiempo de ejecución, se veía así

 //You can get this XAML by using System.Windows.Markup.XamlWriter.Save(yourButton.Template)"; const string controlXaml = "" + "" + "" + "" + "" + "True" + "True" + "" + "True" + "True" + "#FFADADAD" + "False" + ""; 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 }; 

Puedes ver que comento la línea “RenderMouseOver”

Mi primera esperanza era usar FrameworkElementFactory pero necesitaba crear toda la plantilla predeterminada … ¡TODO A MANO! 😉
Utilizando

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

Me dio la plantilla que quería y luego eliminar la sección Renderizar fue fácil.