2011-07-22 32 views
3

我在WP7应用程序中将以下代码添加到App.xaml.cs的构造函数中。当覆盖默认的手机资源时出现NotImplementedException

Resources["PhoneBackgroundBrush"] = new ImageBrush 
{ 
    ImageSource = new BitmapImage(new Uri("/images/bg.png", UriKind.Relative)) 
}; 

运行后,我得到NotImplementedException一旦应用程序打开。

任何想法,我们如何做到这一点?

我试图实现的是像Facebook这样的单一主题应用程序,无论手机的主题如何,它总是有白色的主题。

需要注意的是,资源上的getter始终有效,因此访问电话资源并非完全被代码阻止。 (我正在使用它来确定手机的当前主题和口音)。

var a = Resources["PhoneBackgroundBrush"]; // this works fine 

回答

1

对于简单的例子,当你知道如何时它并不复杂,但是你不应该重命名PhoneBackgroundBrush,而是为你的资源创建一个新的键。

您需要在App.xaml中创建资源(或者您也可以在MergedDictionaries中引入其他位置,但这是更高级的)。 Test.jpg需要成为您项目中的资源文件。

在App.xaml中:

<Application.Resources> 
    <ImageBrush x:Key="MyImageBrush" ImageSource="Test.jpg"/> 
</Application.Resources> 

在例如页面:

Background="{StaticResource MyImageBrush}" 

如果你开始重新模板控制(比如一个按钮),当你需要打开混合并修改控件的默认样式。这是相当有据可查的,并建立在这些相同的原则...

+0

我这样做的原因是为了让它动态设置为不同的东西(基于一些标准) 。 –

+1

您可以随时从App.xaml.cs中的资源字典中检索对象,并在应用程序启动时对其进行修改。我会留意如果在别处修改它。 –

1

基本上你得到一个NotImplementedException的原因是因为二传手为Application.Resources实现这样的:

set 
{ 
    throw new NotImplementedException(); 
} 

原因Facebook是全白,是因为他们定义他们自己的色彩资源,并随处使用它们。我也制作了一款总是以白色为主题的应用程序。它只需要一点额外的努力。

+0

嗯,也许他们以不同的方式编译他们的应用程序,以缩短痛苦:)但明确分配自定义资源到所有控件不适合我 –

+0

大多数控件从其他控件继承前景和背景。这并不困难。你已经花更多时间在SO上进行研究了,而不是像Expression Blend这样的好工具。 –

+0

我不知道继承,但感谢您的建议 –