WPF 4 资源
WPF 4 资源
我有一个让我困惑的问题。我正在为我的MCP考试(70-511 Windows App. Dev. with .Net 4)而学习,我正在学习资源和在代码中更改资源的部分。这是书上的一段引文(自学训练套件):
如果代码中更改了资源所引用的对象,使用该资源的对象的行为将根据资源的引用方式而有所不同。使用DynamicResource标记引用的资源在代码中更改后会使用新对象。使用StaticResource标记引用的资源将继续使用最初从资源集合中检索到的对象,并且不知道更改的发生。
话虽如此,他们让你解决的一个问题是一个XAML问题。以下是该问题的代码:
问题是:当执行以下代码时,按钮的颜色会发生什么变化?
SolidColorBrush aBrush = new SolidColorBrush(Colors.Green); this.Resources["ForegroundBrush"] = aBrush; SolidColorBrush bBrush; bBrush = (SolidColorBrush)this.Resources["BackgroundBrush"]; bBrush.Color = Colors.Black
答案选项为:
- 没有任何变化。
- 背景变为黑色。
- 前景变为绿色。
- 2和3都是。
书中给出的答案是4,即2和3都是。
我的困惑是:如果书中说动态资源会根据代码中的更改而发生变化,而静态资源将继续使用最初检索到的对象,那么为什么上述代码/XAML示例中按钮的背景和前景都会发生变化呢?我已经尝试过,它们确实都会发生变化。
希望能得到帮助。
WPF 4中的资源问题及解决方法
在WPF中,资源是一种可重用的对象,可以在应用程序的不同部分中共享和引用。然而,在某些情况下,更改资源的引用或属性可能无法正确更新UI。本文将讨论这个问题的出现原因以及解决方法。
在WPF中,更改资源引用的行为与ObservableCollections的行为非常相似。ObservableCollections是一种可观察的集合,当将其作为ItemsControl的ItemsSource时,如果更改了这个集合的引用,绑定不会自动刷新,除非手动触发PropertyChanged事件。
下面是一个示例,您可以在构造函数中移动代码行来测试这种行为:
public partial class MainWindow : Window { public MainWindow() { this.DataContext = this; Mycol = new ObservableCollection(); InitializeComponent(); Mycol.Add("this"); Mycol.Add("is"); Mycol.Add("a"); Mycol.Add("test"); } public ObservableCollection Mycol { get; set; } private void Button_Click(object sender, RoutedEventArgs e) { Mycol = new ObservableCollection (); Mycol.Add("??"); } }
在上述示例中,当单击按钮时,更改了Mycol集合的引用,但ListBox不会更新,因为绑定没有自动刷新。然而,如果只是修改了集合的内容,则无论是否手动触发PropertyChanged事件,新的行都会显示出来。
同样的情况也适用于SolidColorBrush的Color属性。如果更改了该属性的值,但引用保持不变,UI也不会正确更新。
为了解决这个问题,可以使用DynamicResource。DynamicResource不仅在更改资源的任何属性时会反映在UI上,而且在更改资源的引用时也会反映在UI上。但需要注意的是,相比StaticResource,DynamicResource可能会略微降低性能。
总结起来,WPF 4中的资源问题在于更改资源的引用或属性时可能无法正确更新UI。解决方法是使用DynamicResource,它可以在更改资源引用或属性时正确更新UI,但会略微降低性能。