2013-07-06 12 views
20

To jest mój XAMLUstawianie kontrolki Kolor tła przy użyciu dynamicznego zasobu w WPF?

<Grid.Resources> 
      <SolidColorBrush x:Key="DynamicBG"/> 
</Grid.Resources> 
<Label name="MyLabel" Content="Hello" Background="{DynamicResource DynamicBG} /> 

Mam więc dwa pytania:

Q1: W jaki sposób przejść o ustawienie wartości klucza do Red z DynamicBG w moim kodu teraz? (Kiedy ładuje się okno, chciałbym ustawić je na czerwony)

Q2: Czy w ten sposób należy korzystać z zasobów dynamicznych?

Dziękuję

Odpowiedz

20

Aby uzyskać dostęp do Resource kodu musi identyfikować je w pliku App.xaml:

<Application.Resources> 
    <SolidColorBrush x:Key="DynamicBG" /> 
</Application.Resources> 

XAML example

<Grid>  
    <Label Name="MyLabel" 
      Content="Hello" 
      Background="{DynamicResource DynamicBG}" /> 

    <Button Content="Change color" 
      Width="100" 
      Height="30" 
      Click="Button_Click" /> 
</Grid> 

Resource można zmienić w linii kodu w postaci:

Application.Current.Resources["MyResource"] = MyNewValue; 

Przykład:

Code behind

// using ContentRendered event 
private void Window_ContentRendered(object sender, EventArgs e) 
{ 
    SolidColorBrush MyBrush = Brushes.Aquamarine; 

    // Set the value 
    Application.Current.Resources["DynamicBG"] = MyBrush;   
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    SolidColorBrush MyBrush = Brushes.CadetBlue; 

    // Set the value 
    Application.Current.Resources["DynamicBG"] = MyBrush; 
} 

zasadzie DynamicResources zostały zaprojektowane, dzięki czemu mogą one zostać zmienione. Gdzie zmienić - to zadanie dewelopera. W przypadku Color jest to jedna z najpopularniejszych metod. Aby uzyskać więcej informacji, patrz MSDN.

P. S. polecam korzystania App.xaml, ponieważ zdarzały się przypadki, gdy StaticResource zostały wykorzystane z powodzeniem, ale nie DynamicResource (zasoby są umieszczane w Window.Resources). Ale po przeniesieniu zasobu w App.xaml wszystko zaczęło działać.

+1

dziękuję za odpowiedź informacyjną. –

6

A1: Należy przesunąć "DynamicBG" do okna zasobu i po tym można użyć Resources nieruchomość w Loaded obsługi zdarzenia:

XAML:

<Window x:Class="MyLabelDynamicResource.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 
     Loaded="Window_Loaded"> 
    <Window.Resources> 
     <SolidColorBrush x:Key="DynamicBG"/> 
    </Window.Resources> 
    <Grid>  
     <Label Name="MyLabel" Content="Hello" Background="{DynamicResource DynamicBG}" /> 
    </Grid> 
</Window> 

Code za:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     this.Resources["DynamicBG"] = new SolidColorBrush(Colors.Red); 
    }  
} 

A2: Powinieneś używać zasobów dynamicznych, gdy chcesz zmienić właściwość w środowisku wykonawczym.

+0

dziękuję za poświęcony czas i szczegółową odpowiedź, wstyd, muszę wybrać tylko jedną odpowiedź. + 1'na –

3

A2: nie. Aby zrobić to, co robisz, lepiej jest użyć powiązania danych. Masz właściwość w swoim modelu widoku wskazującą, czy jest ona "załadowana", a następnie powiąż z nią tło odpowiednim konwerterem lub użyj spustu. (Jeśli w rzeczywistości jest to ładowanie UI, dodaj właściwość do okna.) Zasoby dynamiczne są używane do tworzenia motywów i szablonów, w rzadkich przypadkach, gdy wyszukiwanie StaticResource następuje zbyt wcześnie.

+0

dzięki, to jest bardzo pouczające. –

Powiązane problemy