WPF 4 资源

12 浏览
0 Comments

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

答案选项为:

  1. 没有任何变化。
  2. 背景变为黑色。
  3. 前景变为绿色。
  4. 2和3都是。

书中给出的答案是4,即2和3都是。

我的困惑是:如果书中说动态资源会根据代码中的更改而发生变化,而静态资源将继续使用最初检索到的对象,那么为什么上述代码/XAML示例中按钮的背景和前景都会发生变化呢?我已经尝试过,它们确实都会发生变化。

希望能得到帮助。

0
0 Comments

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,但会略微降低性能。

0