2009-03-09 11 views
32

¿Cómo puedo hacer esto en el código subyacente de WPF?¿Cómo puedo establecer el color de un control WPF en un color de sistema mediante programación, para que se actualice en los cambios de esquema de color?

<Grid Background="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}"/> 
+5

Gracias por publicar esta pregunta. Todavía estoy aprendiendo WPF y no pude entender cómo hacer esto en XAML, pero tu pregunta muestra exactamente cómo hacerlo. Usé esto en su lugar: ¡Gracias! – Pretzel

+11

FWIW no necesita definir DynamicResource, puede acceder al pincel estático directamente: Background = "{x: Static SystemColors.ControlBrush}" –

+5

Reviso mi comentario anterior: No necesita especificar un DynamicResource si cree que su los usuarios cambiarán el tema del sistema mientras la aplicación se está ejecutando. Si solo usa {x: Static ...} y el tema cambia, los colores de su aplicación no cambiarán para coincidir. También DynamicResource es necesario cuando se usa un Setter de un Estilo, p. . –

Respuesta

13

que acaba de encontrar una solución fea:

grid1.SetResourceReference(
    Control.BackgroundProperty, 
    SystemColors.DesktopBrushKey); 

espero que alguien va a publicar uno mejor (me gustaría ver algo como grid1.Background = BackgroundBrush, porque la sintaxis de SetResourceReference es un paso atrás de Windows Forms).

+0

No creo que esto sea feo. Parece bastante normal si quieres hacerlo en código detrás. –

6

Los métodos de extensión podrían ayudar:

public static class FrameworkElementExtensions 
{ 
    // usage xPanel.SetBackground(SystemColors.DesktopBrushKey); 
    public static void SetBackground(this Panel panel, ResourceKey key) 
    { 
     panel.SetResourceReference(Panel.BackgroundProperty, key); 
    } 

    // usage xControl.SetBackground(SystemColors.DesktopBrushKey); 
    public static void SetBackground(this Control control, ResourceKey key) 
    { 
     control.SetResourceReference(Control.BackgroundProperty, key); 
    } 
} 
+0

esto se puede cambiar a lo siguiente, porque todos los thies son del tipo FrameworkElement:
'public static class FrameworkElementExtensions { // usage xControl.SetBackground (SystemColors.DesktopBrushKey); public static void SetBackground (este control FrameworkElement, clave ResourceKey) { control.SetResourceReference (Control.BackgroundProperty, clave); } } ' –

4

Esto debe haber sido añadido a una versión posterior de WPF ya que este fue originalmente publicado debido a que su código original funciona bien para mí (estoy usando WPF 4.5)

<Grid Background="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}"/>

+0

Esto funciona genial! – psulek

+0

¡Trabajó para mí, gracias! –

+0

Pareces haber entendido mal la pregunta. OP sabe que el código XAML funciona. Él está buscando el código equivalente detrás, es decir, el código C#. –

2
+0

Tenga en cuenta que esto no se actualizará cuando cambie el Color del sistema, como cuando el usuario cambia al modo de contraste alto a menos que escuche los eventos de cambio y los restablezca manualmente. – jt000

Cuestiones relacionadas