日期:2014-05-17  浏览次数:20826 次

windows phone:资源(一)
解决重复标记最普遍的方案是采用silverlight样式。但样式的先决条件是一种更为普遍的共享制度:资源(resource)。
xaml资源常常作为特殊的.net类或结构体的实例,要么是一个现有类或结构体,要么是自定义类。当一个特定类被定义为xaml的资源时,系统只会创建一个该类的实例,该实例将在引用该资源的各个对象之间共享。
由于资源是共享的,很多类不能被定义为xaml资源。例如,TextBlock单个实例不允许被多次使。由于不能共享,从UIElement派生的任何元素都不能以资源的形式出现。
Applicationod类中定义的Resources如下:
<Application ...>
  <Application.Resources>
    ...
  </Application.Resources>
</Application>
在FrameworkElememnt中定义Resources如下:
<phone:PhoneApplicationPage ...>
  <phone:PhoneApplicationPage.Resources>
    ...
  </phone:PhoneApplicationPage.Resources>
  ...
</phone:PhoneApplicationPage>
下面是一个例子:
1.定义资源
<phone:PhoneApplicationPage.Resources>
  <LinearGradientBrush x:Key="brush"> <!-- 以x开头的关键字有4个,x:Class,x:Name,x:Null,x:Key -->
    <GradientStop Offset="0" Color="Pink" />
    <GradientStop Offset="1" Color="SkyBlue" />
  </LinearGradientBrush>
</phone:PhoneApplicationPage.Resources>
2.在xaml中使用资源
<TextBlock ...>
  <TextBlock.Foreground>
    <StaticResource ResourceKey="brush" />
  </TextBlock.Foreground>
</TextBlock>
或者
<TextBlock ...
  Foreground="{StaticResource brush}"
/>
3.在代码中访问资源
txtblk.Foreground = (Brush)this.Resources["brush"]; //这里的txtblk是一个TextBlock对象
由于Silverlight 1.0遗留的问题,所以可以使用x:Name而不是x:Key标识资源,如:
<LinearGradientBrush x:Name="brush">
  ...
</LinearGradientBrush>
这样做的好处是:名称作为一个字段存储在生成的代码文件中,因此可以这样引用该资源:
txtblk.Foreground = brush;
但是,如果使用x:Name资源,该名称在xaml文件中必须是唯一的。