在WPF中使用动态资源设置控件背景颜色?

时间:2013-07-06 11:25:48

标签: c# wpf

这是我的XAML

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

所以我有两个问题:

Q1:如何在我的代码中将DynamicBG键值设置为红色? (当窗口加载时,我想将其设置为红色)

Q2:这是应该如何使用动态资源吗?

谢谢

3 个答案:

答案 0 :(得分:22)

要获得对Resource代码的访问权限,必须在文件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

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

示例:

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

原则,设计DynamicResources,因此可以更改它们。在哪里改变 - 这是开发人员的任务。在Color的情况下,它是最常用的方法之一。有关详细信息,请参阅MSDN

P上。 S.我建议使用App.xaml,因为有些情况下成功使用了StaticResource,而DynamicResource没有使用Window.Resources(资源放在App.xaml中)。但是在{{1}}中移动资源后,一切都开始起作用了。

答案 1 :(得分:6)

A1: 你应该移动&#34; DynamicBG&#34;到窗口资源,之后你可以在Resources事件处理程序中使用Loaded属性:

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>

代码隐藏:

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

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

A2: 如果要在运行时更改属性,则应使用动态资源。

答案 2 :(得分:3)

A2:不。要做你正在做的事情,最好使用数据绑定。在viewmodel中有一个属性,指示它是否已“加载”,然后使用合适的转换器将背景绑定到它,或使用触发器。 (如果它实际上是正在加载的UI,请将该属性添加到窗口。)动态资源用于主题和模板,在极少数情况下,StaticResource查找过早发生。