当前位置: 首页 > 编程语言 > .NET综合 > 正文

WPF学习之资源-Resources(7)

时间:2010-07-18 cnblogs zlgcool Allan

5.资源的应用

前变也已经说过可以引用别的程序集的资源,那么到底如何引用呢?另外,我们都是在说XAML中引用资源,那么代码中又该如何去做呢?我们又通常会在什么地方定义资源呢?这里就来说一下这几个问题,以及某些特殊情况下的定义。

· 共享资源

默认情况下,当有一个资源被引用到多个地方是,使用的都是同一个对象实例,这通常是理想的行为。但你同样也可以把x:Shared=”False”来让每个引用资源的地方都生成一个不同的对象实例,这样可以独立进行修改。这通常用于多逻辑资源的声明。

· 程序代码中定义和应用资源

在代码中定义一个新的Resource,你需要首先得到一个ResourceDictionary的实例,然后再创建一个新的资源并将这个资源加入到ResourceDictionary的实例中。而在访问资源时,你需要用到myWindow.Resources[“key”]或者object.FindResource(key)函数。注意myWindows是你当前window的实例,而在用FindResource时,前边的object代表的是这个资源所在的ResourceDictionary的父对象。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
  Window3 window = new Window3();
  window.Resources.Add("buttonBackground", new SolidColorBrush(Color.FromRgb(0,255,0)));
  window.Resources.Add("borderBrush", new SolidColorBrush(Color.FromRgb(255, 0, 0)));
  btnContent.Background = (Brush)window.FindResource("buttonBackground");
  btnContent.BorderBrush = (Brush)window.FindResource("borderBrush");
}

注意在找不到资源时会抛出一个ResourceReferenceKeyNotFoundException异常,所以尽量调用TryFindResource方法更好些,如果失败将会返回null.

上边的例子是针对StaticResource来说的,它就相当于这段代码:

<Button x:Name="btnContent" Canvas.Left="50"
Background="{StaticResource buttonBackground}"
BorderBrush="{StaticResource borderBrush}" Content="Content" />

但对于DynamicResource来说,需要调用这个元素的SetResourceReference方法来更新依赖属性的绑定。下边的两端代码是相等的:

<Button x:Name="btnContent" Canvas.Left="50"
Background="{DynamicResource buttonBackground}"
BorderBrush="{ DynamicResource borderBrush}" Content="Content" />

btnContent.SetResourceReference(Button.BackgroundProperty, "buttonBackground");
btnContent.SetResourceReference(Button.BorderBrushProperty, "borderBrush");

SetResourceReference是可以在资源被加载到某个Resource Dictionary之前调用的,即便是FindResource会失败,但引用的建立仍然有效。

· 从另一个程序集中访问嵌入式资源

除了可以用特定的URI来访问别的程序中的二进制资源外,WPF可以从另外一个程序集中获取逻辑资源,这得用到ComponentResourceKey标记。要使用ComponentResourceKey,每个资源都必须有一个键名。然后你可以通过这样的方式访问:

<Button Background=”{DynamicResource {x:Static otherAssembly: MyClass.MyClassBrushKey }}” />