Silverlight4:全球化应用部署与样式模板的深度解析
立即解锁
发布时间: 2025-08-25 00:27:26 阅读量: 1 订阅数: 13 

# Silverlight 4:全球化应用部署与样式模板的深度解析
## 一、全球化 Silverlight 应用部署准备
### 1.1 传统部署方式及问题
在将 Silverlight 应用部署为支持不同文化的全球化应用时,编译项目后,默认文化(Strings.resx 文件)会成为主应用程序集的一部分。主应用程序集连同默认资源和其他添加的附属程序集将被插入到 Silverlight XAP 文件中,每个附属程序集在 AppMainifest.xml 文件的 Deployment.Parts 部分定义。
不过,这种方法存在明显缺点。所有附属程序集文件都是默认 Silverlight XAP 文件的一部分,会在启动时下载。若应用定义了多种文化,XAP 包文件大小会增加,从而降低应用的启动性能。此外,若应用以脱机模式运行,还需提供特定文化的附属程序集。
### 1.2 优化部署方式
Silverlight 允许为每种文化开发本地化、特定文化的应用程序包,这种方式可减小 XAP 包大小,提高应用启动性能。可使用 Visual Studio 配置管理器来定义和创建本地化应用程序包。
如需了解如何部署目标本地化应用的更多详细信息,可参考微软 MSDN 网站:[http://msdn.microsoft.com/en-us/library/cc838238(VS.96).aspx](http://msdn.microsoft.com/en-us/library/cc838238(VS.96).aspx) 。若要了解如何本地化脱机应用的信息,可访问:[http://msdn.microsoft.com/en-us/library/dd772170(VS.96).aspx](http://msdn.microsoft.com/en-us/library/dd772170(VS.96).aspx) 。
## 二、XAML 功能增强
### 2.1 灵活的根 XAML 命名空间
在 Silverlight 3 及更早版本中,必须使用根 XAML 命名空间 `xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"`。而 Silverlight 4 引入了定义根 XAML 命名空间的灵活性,现在可根据需求使用自定义 XAML 命名空间。
### 2.2 XmlnsDefinitionAttribute
Silverlight 4 支持 XmlnsDefinition 属性来声明自定义程序集的命名空间。因此,Silverlight SDK 和工具包现在支持该属性,无需显式定义所有引用的程序集和命名空间。例如,要使用 Silverlight 工具包中的 WrapPanel 控件,只需在用户控件级别定义命名空间 `xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"` 即可使用任何工具包控件,而无需像之前那样添加特定程序集 `xmlns:c="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"`。
### 2.3 直接内容
Silverlight 4 解析器现在允许将直接内容应用于 XAML 控件,这让 WPF 开发者感到欣慰。例如,可像在 WPF 中那样设置按钮内容:
```xml
<Button>I am a Button</Button>
```
而在 Silverlight 3 中,必须使用按钮的 Content 属性:
```xml
<Button Content="I am a Button"/>
```
### 2.4 空白处理
Silverlight 3 及更早版本会原样保留额外的空白。例如,以下 XAML 会使 “This is” 和 “new line” 文本显示在两行中:
```xml
<TextBlock>
<TextBlock.Text>This is
new line
</TextBlock.Text>
</TextBlock>
```
若在 Silverlight 4 中运行相同的 XAML 代码,它会丢弃额外的 CRLF 空白,使文本 “This is new line” 在一行中输出。与 WPF 类似,在 Silverlight 4 中可使用 `xml:space="preserve"` 来保留 CRLF 空白。例如:
```xml
<TextBlock xml:space="preserve">
<TextBlock.Text>This is
new line
</TextBlock.Text>
</TextBlock>
```
### 2.5 自定义 IDictionary 支持
在 Silverlight 4 中,不限于在 ResourceDictionary 中使用 x:Key 属性实现字典并添加项。它将 x:Key 的使用扩展到任何可实现 IDictionary 的 XAML 元素,以实现自定义字典并在其中添加项。
为支持向后兼容性,Silverlight 4 核心库并排包含 Silverlight 3 和 4 的 XAML 解析器。这意味着使用 Silverlight 4 运行时运行任何 Silverlight 3(已编译)应用时不会有问题。但在 Visual Studio 中打开 Silverlight 3 项目以迁移到 Silverlight 4 时,需进行所有必要的更正。
## 三、Silverlight 样式和模板
### 3.1 样式和模板基础
Silverlight 具备轻松设置用户界面元素样式并改变控件外观(与行为分离)的能力。样式类似于 CSS 属性的工作方式,用户界面元素可通过将特定样式应用于 FrameworkElement 来重用指定为样式的字体、颜色和大小。模板则仅限于基于控件的类,用于完全改变控件的视觉呈现方式,因为控件的行为与外观是分离的。这两种功能为使用 Silverlight 的设计师和开发者提供了大量的用户界面自定义功能。
### 3.2 Silverlight 4 中的增强
在 Silverlight 4 之前,缺少为特定控件定义一致样式/主题并应用于应用中该控件所有实例的功能。Silverlight 4 引入了隐式样式功能,允许将样式定义为资源,并隐式地将其目标设定为特定类型的 UIElement。这可根据控件类型对主题进行分类,为应用中特定类型的控件提供一致的外观和感觉。
### 3.3 使用样式
#### 3.3.1 简单应用与大型应用的区别
如果构建的是只有几个用户界面屏幕的简单应用,直接在用户界面元素上设置诸如 FontSize 和颜色等属性可能是合理的。但如果构建的是大型应用,很快会发现自己在一页又一页上重复相同的属性值。
#### 3.3.2 样式的定义和使用
在 Silverlight 中,样式是一组属性和特定值,可在页面内甚至整个应用中重用。特定样式会被赋予一个名称并存储在资源字典中,因此样式可作用于页面或应用级别。虽然可以将样式放置在任何资源字典中,但实际上,样式很少出现在页面或应用级别之外,因为样式的好处在于重用一组属性值。
例如,一个常见的网站布局包括主标题、导航菜单和页面内容。主标题和导航菜单在用户从一个页面导航到另一个页面时始终存在,而页面内容会发生变化。在 ASP.NET 中,导航菜单和主标题会放在一个称为母版页的地方,将网站的公共部分与特定页面部分分开。
以下是未使用样式的 XAML 代码:
```xml
<Grid.ColumnDefinitions>
<ColumnDefinition Width="85"/>
<ColumnDefinition Width="75"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<StackPanel Grid.Row="1" Grid.Column="0">
<ListBox>
<ListBoxItem>
<Button Content="Home" Width="60" Margin="5"/>
</ListBoxItem>
<ListBoxItem>
<Button Content="DVDs" Width="60" Margin="5"/>
</ListBoxItem>
<ListBoxItem>
<Button Content="Music" Width="60" Margin="5"/>
</ListBoxItem>
<ListBoxItem>
<Button Content="Help" Width="60" Margin="5"/>
</ListBoxItem>
<ListBoxItem>
<Button Content="Sign Out" Width="60" Margin="5"/>
</ListBoxItem>
</ListBox>
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="2" VerticalAlignment="Top">
<TextBlock FontSize="20">Ulysses by James Joyce</TextBlock>
<TextBlock FontSize="12" TextWrapping="Wrap">
The ultimate tale of what it means to be human. Heralded as one
of the best works of fiction during the 20th century.
</TextBlock>
</StackPanel>
```
可以看到导航按钮中 Width 和 Margin 属性的重复,并且页面内容的属性值需要手动保持一致。为了解决这些问题,可将这些属性提取并分组为三种样式:一种用于导航按钮,一种用于页面标题,一种用于页面内容。
Style 类派生自 System.Windows.DependencyObject,包含不同的属性设置器,可应用于相似类型的 UI 元素实例。其属性如下表所示:
| 属性 | 类型 | 描述 |
| --- | --- | --- |
| BasedOn | Style | 获取或设置作为当前样式基础的已定义样式。每个样式仅支持一个 BasedOn 样式。当样式被密封时,BasedOn 样式不能更改。BasedOn 样式的 TargetType 属性必须与样式的 TargetType 匹配或派生自它。 |
| IsSealed | bool | 如果样式是只读的且不能更改,则返回 true。 |
| Setters | SetterBaseCollection | 获取 Setter 对象的集合。每个 Setter 对象都有一个 Property 和一个 Value。Property 包含应用样式的元素的属性名称,Value 定义将应用于元素属性的值。 |
| TargetType | Type | 获取或设置样式所针对的类型,这是定义样式的必需属性。 |
这些样式会被放入应用的资源字典(App.xaml 文件)中:
```xml
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="chapter8.App">
<Application.Resources>
<Style x:Key="ContentHeader" TargetType="TextB
```
0
0
复制全文