2013-07-06 10 views
20

Questo è il mio XAMLImposta il colore di sfondo del controllo utilizzando la Risorsa dinamica in WPF?

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

Così ho due domande:

Q1: Come posso fare per impostare il valore di DynamicBG chiave per Red nel mio codice adesso? (Quando la finestra si carica, vorrei impostarla in rosso)

Q2: È così che si suppone che le risorse dinamiche vengano utilizzate?

Grazie

risposta

20

Per accedere alla Resource del codice di essi deve identificare nel file 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> 

Il Resource può essere modificato in linea codice del modulo:

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

Esempio:

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; 
} 

Principio, DynamicResources sono stati progettati, in modo che possono essere cambiati. Dove cambiare: è compito dello sviluppatore. Nel caso di Color, è uno dei metodi più comuni. Vedere lo MSDN, per ulteriori informazioni.

P. S. mi consiglia di utilizzare App.xaml, perché ci sono stati casi in cui un StaticResource è stato usato con successo, ma non DynamicResource (risorse vengono inseriti nella Window.Resources). Ma dopo aver spostato la risorsa in App.xaml, tutto ha iniziato a funzionare.

+1

grazie per la tua risposta informativa. –

6

A1: Si dovrebbe spostare "DynamicBG" per risorsa finestra e dopo che è possibile utilizzare Resources proprietà in Loaded gestore di eventi:

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- dietro:

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

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

A2: È necessario utilizzare le risorse dinamiche quando si desidera modificare la proprietà in runtime.

+0

grazie per il vostro tempo e per aver risposto in dettaglio, peccato che devo scegliere solo una risposta. + 1'd –

3

A2: no. Per fare ciò che si sta facendo, è meglio utilizzare l'associazione dati. Avere una proprietà nel tuo modello di visualizzazione che indica se è "caricato", quindi associare lo sfondo ad esso con un convertitore adatto, o utilizzare un trigger. (Se è in realtà un'interfaccia utente in fase di caricamento, aggiungi la proprietà alla finestra.) Le risorse dinamiche vengono utilizzate per il tema e con i modelli, nei rari casi in cui una ricerca di StaticResource avviene troppo presto.

+0

grazie, è molto istruttivo. –

Problemi correlati