Silverlight样式与行为全解析
立即解锁
发布时间: 2025-08-26 01:42:29 阅读量: 12 订阅数: 45 AIGC 

### Silverlight 样式与行为全解析
#### 1. 样式的应用
在 Silverlight 中,每个元素都可以使用一种样式(也可以不使用样式)。样式通过元素的 `Style` 属性(在 `FrameworkElement` 基类中定义)应用到元素上。例如,要让按钮使用之前创建的样式,可以这样做:
```xml
<Button Style="{StaticResource BigButtonStyle}"
Content="A Customized Button"></Button>
```
样式系统带来了诸多好处:
- 能够创建相关设置的组,使代码更清晰。
- 简化标记,更方便地应用设置。
- 应用样式时无需担心具体设置了哪些属性。
如果之后发现大字体按钮需要更多的内边距和外边距,可以为 `Padding` 和 `Margin` 属性添加设置器,所有使用该样式的按钮会自动应用新的样式设置。不过,样式设置的元素初始外观是可以被覆盖的。比如,应用了 `BigButtonStyle` 样式后,再显式设置 `FontSize` 属性,按钮标签中的 `FontSize` 设置会覆盖样式中的设置。理想情况下,应避免依赖这种覆盖行为,若需更改样式,建议创建一个新样式来设置相应属性,这样能在未来调整用户界面时更灵活,且干扰最小。
#### 2. 动态样式
通常可以在标记中链接样式,也能通过编程方式设置样式。要从页面的资源集合中检索 `BigButtonStyle` 并应用到名为 `cmd` 的 `Button` 对象上,可使用以下代码:
```csharp
cmd.Style = (Style)this.Resources["AlternateBigButtonStyle"];
```
还能从项目中的单独资源字典文件(或引用的程序集)中检索样式。步骤如下:
1. 创建 `ResourceDictionary` 对象并提供正确的 URI:
```csharp
ResourceDictionary resourceDictionary = new ResourceDictionary();
resourceDictionary.Source = new Uri("/Styles/AlternateStyles.xaml",
UriKind.Relative);
```
此示例假设资源字典是项目文件夹 `Styles` 中名为 `AlternateStyles.xaml` 的文件,且该资源字典必须编译为内容文件(在属性窗口中将“生成操作”设置为“内容”)。
2. 配置好 `ResourceDictionary` 后,从其中检索对象:
```csharp
Style newStyle = (Style)resourceDictionary["BigButtonStyle"];
cmd.Style = newStyle;
```
若要移除样式,将 `Style` 属性设置为 `null`。动态更改样式的能力为创建可换肤应用程序提供了可能,但实现这样的系统会很繁琐,因为需要通过编程方式检索每个样式对象并设置每个样式化控件。而在 WPF 中,只需交换新的合并字典,使用该合并字典样式的所有控件就会自动更新。
#### 3. 样式继承
在某些情况下,可能希望以一种样式的属性为基础创建更专业的样式,可通过设置样式的 `BasedOn` 属性来实现样式继承。例如:
```xml
<UserControl.Resources>
<Style x:Key="BigButtonStyle" TargetType="Button">
<Setter Property="FontFamily" Value="Georgia" />
<Setter Property="FontSize" Value="40" />
<Setter Property="Padding" Value="20" />
<Setter Property="Margin" Value="10" />
</Style>
<Style x:Key="EmphasizedBigButtonStyle" TargetType="Button"
BasedOn="{StaticResource BigButtonStyle}">
<Setter Property="BorderBrush" Value="Black" />
<Setter Property="BorderThickness" Value="5" />
</Style>
</UserControl.Resources>
```
第一个样式 `BigButtonStyle` 定义了四个属性,第二个样式 `EmphasizedBigButtonStyle` 继承了 `BigButtonStyle` 的这些属性,并补充了两个属性,为按钮添加了粗黑色边框。这种设计可以单独应用字体设置或字体与颜色的组合,也能创建更多包含已定义字体或颜色细节的样式。可以使用 `BasedOn` 属性创建一系列继承样式,但如果两次设置同一属性,最后一个属性设置器(继承链中派生类中的设置器)会覆盖之前的定义。
需要注意的是,继承样式的 `TargetType` 不必与父样式相同,但如果样式继承了目标元素类型中不存在的属性设置器,会引发错误。不过,样式继承虽看似方便,但通常会带来问题,因为它和代码继承一样存在依赖关系,会使应用程序更脆弱。例如,若更改 `BigButtonStyle`,`EmphasizedBigButtonStyle` 也会随之改变,除非显式添加更多设置器来覆盖继承的值。在实际应用中,这种问题会更严重,所以除非有特定原因,否则在使用样式继承前要谨慎考虑。
#### 4. 样式的组织
样式对象通常在页面级别定义,然后在该页面内的按钮中重用,但这并非唯一选择。实际上,不一定要将样式和资源一起使用,比如可以直接填充按钮的 `Style` 集合来定义其样式:
```xml
<Button Content="A Customized Button">
<Button.Style>
<Style TargetType="Button">
<Setter Property="FontFamily" Value="Georgia" />
<Setter Property="FontSize" Value="40" />
<Setter Property="Foreground" Value="White" />
</Style>
</Button.Style>
</Button>
```
但这种方法无法与其他元素共享样式。更实用的做法是在不同的资源集合中定义样式:
- 若要创建更有针对性的样式,可以使用其容器(如 `StackPanel` 或 `Grid`)的资源集合来定义。
- 同一样式可以在多个级别定义,Silverlight 会按照标准资源解析过程查找匹配名称的样式,先在当前元素的资源集合中查找,再依次查找包含元素及其容器的资源集合。
- 若要在应用程序中重用样式,可以在应用程序的资源集合(在 `App.xaml` 文件中)中定义,或者将其放在单独的资源字典中,并合并到需要它的每个页面的资源集合中。
#### 5. 按类型自动应用样式
除了创建命名样式并在标记中引用,还可以按类型自动应用样式。只需设置 `TargetType` 属性来指定适当的类型,不指定键名即可。例如:
```xml
<Style TargetType="Button">
```
这样,该样式会自动应用到元素树中的所有按钮。例如,在 `UserControl.Resources` 集合中以这种方式定义样式,它会应用到该页面中的每个按钮(除非有更下游的样式替换它)。以下示例自动设置按钮样式,达到与之前相同的效果:
```xml
<UserControl.Resources>
<Style TargetType="Button">
<Setter Property="FontFamily" Value="Georgia" />
<Setter Property="FontSize" Value="40" />
<Setter Property="Foreground" Value="SlateGray" />
<Setter Property="Padding" Value="20" />
<Setter Property="Margin" Value="10" />
</Style>
</UserControl.Resources>
<StackPanel x:Name="LayoutRoot" Background="White">
<Button Content="A Customized Button"></Button>
<Button Content="Another Customized Button"></Button>
</StackPanel>
```
0
0
复制全文
相关推荐










