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

24

这是我的XAML

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

所以我有两个问题:

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

问题2:这是否是动态资源应该使用的方式?

谢谢

3个回答

24

要访问代码的Resource,必须在App.xaml文件中标识它们:

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

XAML示例

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

示例:

后台代码

// 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

附言:我建议使用 App.xaml,因为曾经出现过成功使用 StaticResource 但未能使用 DynamicResource(资源被放置在 Window.Resources 中)的情况。但将资源移动到 App.xaml 后,所有问题都得到了解决。


8

A1: 您应该将 "DynamicBG" 移动到窗口资源中,然后可以在 Loaded 事件处理程序中使用 Resources 属性:

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

您需要在运行时更改属性时,应使用动态资源。

感谢您花费时间并详细回答,很遗憾我只能选择一个答案。已点赞。 - iAteABug_And_iLiked_it

3

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接