¿Cómo puedo estilizar el borde y la barra de título de una ventana en WPF?


Estamos desarrollando una aplicación WPF que utiliza el conjunto de controles de Telerik y todo funciona y se ve bien. Desafortunadamente, recientemente necesitábamos reemplazar la clase base de todos nuestros diálogos, cambiando RadWindow por la ventana estándar WPF (la razón es irrelevante para esta discusión). Al hacerlo, terminamos teniendo una aplicación que todavía se veía bastante en todos los equipos del desarrollador (Windows 7 con Aero habilitado) pero era feo cuando se usa en el entorno de nuestro cliente (Terminal Services bajo Windows Server 2008 R2).

RadWindow de Telerik es un control de usuario estándar que imita el comportamiento de un diálogo, por lo que el estilo no fue un problema. Sin embargo, con la ventana de WPF, me cuesta cambiar su "borde". Lo que quiero decir con "borde" aquí es tanto la barra de título con el icono y los 3 botones estándar (Minimizar, Maximizar/Restaurar, Cerrar) y el agarre de cambio de tamaño alrededor de la ventana.

¿Cómo puedo cambiar el aspecto de estos elementos:

  • Color de la barra de título
  • 3 estándar botones
  • Color real del borde de la ventana

Con esquinas redondeadas si es posible.

Author: Marcel Gosselin, 2012-04-02

6 answers

Estas son áreas "no cliente" y están controladas por Windows. Aquí están los documentos de MSDN sobre el tema (la información pertinente está en la parte superior).

Básicamente, usted establece el WindowStyle="None" de su ventana, luego construye su propia interfaz de ventana. (pregunta similar sobre SO )

 25
Author: Muad'Dib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:28

Es necesario establecer

WindowStyle="None", AllowsTransparency="True" y, opcionalmente, ResizeMode="NoResize"
y luego establezca la propiedad Style de la ventana a su estilo de ventana personalizado, donde diseña la apariencia de la ventana (barra de título, botones, borde) a cualquier cosa que desee y muestre el contenido de la ventana en un ContentPresenter.

Este parece ser un buen artículo sobre cómo puede lograr esto, pero hay muchos otros artículos en Internet.

 12
Author: Lescai Ionel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-14 14:56:44

Encontré una solución más directa de @DK comment en esta pregunta , la solución está escrita por Alex y descrita aquí con la fuente, Para hacer una ventana personalizada:

  1. descargue el proyecto de ejemplo aquí
  2. edite el genérico.archivo xaml para personalizar el diseño.
  3. disfruta:).
 5
Author: Anas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:28

Compruebe el siguiente ejemplo WPF personalizando la apariencia de una ventana en XAML

Este ejemplo muestra cómo personalizar completamente el estilo/apariencia de una ventana, incluidas las áreas que no son clientes: barra de título, bordes, botones max, min y close, al mismo tiempo que proporciona toda la funcionalidad esperada.

 3
Author: Abou-Emish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-13 11:46:06

Le sugiero que comience desde una solución base y personalícela para que se ajuste a sus necesidades, ¡es mejor que comenzar desde cero!

Estaba buscando lo mismo y caigo en esta solución de código abierto, espero que ayude.

 1
Author: Belahcene Benzara Tahar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-30 13:32:37

Si alguien te está diciendo que no puedes porque esa sería el área no cliente y solo Windows puede controlar esto, ¡están equivocados!

Eso es solo una verdad a medias porque Windows le permite especificar tamaños para el área que no es cliente. El hecho es que esto es posible a través de los métodos del kernel de Windows, y estás en. NET, no en C++. De todos modos, no te preocupes! ¡P / Invoke existe solo para tal cosa! Por lo tanto, puede invocar métodos del núcleo para configurar el área no cliente.

Sin embargo, esto es una solución realmente complicada que se me ocurrió muchas veces. Afortunadamente, a partir de.NET 4.5, puede usar la clase WindowChrome para configurar el área no cliente como desee. Aquí puede acceder a MSDN.

Para hacer las cosas más simples y limpias, te redirigiré aquí, una guía para cambiar el tamaño del borde de la ventana a lo que quieras. Al configurarlo en 0, podrá implementar su borde de ventana personalizado en lugar del borde del sistema.

Me disculpo por no publicar un claro ejemplo, pero más tarde lo haré con seguridad.

 0
Author: Davide Cannizzo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-26 14:35:04