2009-03-09 8 views
32

Jak mogę to zrobić w zabezpieczeniach WPF?Jak można programowo ustawić kolor kontrolki WPF na kolor systemowy, aby był on aktualizowany w przypadku zmiany schematu kolorów?

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

Dziękujemy za zamieszczenie tego pytania. Nadal uczę się WPF i nie mogłem wymyślić, jak to zrobić w XAML, ale twoje pytanie pokazuje dokładnie, jak to zrobić. Użyłem tego zamiast: Dzięki! – Pretzel

+11

FWIW nie musisz definiować DynamicResource, możesz uzyskać bezpośredni dostęp do pędzla statycznego: Background = "{x: Static SystemColors.ControlBrush}" –

+5

Poprawię mój wcześniejszy komentarz: Musisz określić DynamicResource, jeśli uważasz, że użytkownicy będą zmieniać motyw systemowy podczas działania aplikacji. Jeśli po prostu użyjesz {x: Static ...} i zmienisz temat, twoje kolory aplikacji się nie zmienią. Również DynamicResource jest niezbędny, gdy używasz Setera stylów, np. . –

Odpowiedz

13

Właśnie znalazłem brzydki rozwiązanie:

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

Mam nadzieję, że ktoś będzie zakładać lepszy (chciałbym zobaczyć coś takiego grid1.Background = BackgroundBrush, ponieważ jest składnia SetResourceReference krok wstecz w stosunku do Windows Forms). może pomóc

+0

Nie sądzę, że to jest brzydkie. Wygląda całkiem normalnie, jeśli chcesz to zrobić za kodem. –

6

metody rozszerzeń:

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

można to zmienić na następujące, ponieważ wszystkie te są typu FrameworkElement:
'public static class FrameworkElementExtensions { // użycie xControl.SetBackground (SystemColors.DesktopBrushKey); public static void SetBackground (ta kontrolka FrameworkElement, klucz ResourceKey) { control.SetResourceReference (Control.BackgroundProperty, klucz); } } ' –

4

ta musi być dodana do nowszej wersji WPF ponieważ ten został pierwotnie opublikowany, ponieważ oryginalny kod działa dobrze dla mnie (ja używam WPF 4.5)

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

+0

Działa to świetnie! – psulek

+0

Pracowałem dla mnie, dziękuję !! –

+0

Wydaje się, że źle zrozumiałeś pytanie. OP wie, że działa kod XAML. Szuka równoważnego kodu z tyłu, tj. Kodu C#. –

2
+0

Należy pamiętać, że nie będzie to aktualizowane, gdy Kolor Systemu zmieni się, gdy użytkownik przełączy się w tryb Hi-Contrast, o ile nie będzie nasłuchiwał zdarzeń zmian i resetował je ręcznie. – jt000

Powiązane problemy