这是我的XAML
<Grid.Resources>
<SolidColorBrush x:Key="DynamicBG"/>
</Grid.Resources>
<Label name="MyLabel" Content="Hello" Background="{DynamicResource DynamicBG} />
所以我有两个问题:
Q1:如何在我的代码中将DynamicBG
键值设置为红色? (当窗口加载时,我想将其设置为红色)
Q2:这是应该如何使用动态资源吗?
谢谢
答案 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查找过早发生。