活动介绍

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 ```
corwn 最低0.47元/天 解锁专栏
赠100次下载
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

张诚01

知名公司技术专家
09级浙大计算机硕士,曾在多个知名公司担任技术专家和团队领导,有超过10年的前端和移动开发经验,主导过多个大型项目的开发和优化,精通React、Vue等主流前端框架。
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

【PJSIP高效调试技巧】:用Qt Creator诊断网络电话问题的终极指南

![【PJSIP高效调试技巧】:用Qt Creator诊断网络电话问题的终极指南](https://www.contus.com/blog/wp-content/uploads/2021/12/SIP-Protocol-1024x577.png) # 摘要 PJSIP 是一个用于网络电话和VoIP的开源库,它提供了一个全面的SIP协议的实现。本文首先介绍了PJSIP与网络电话的基础知识,并阐述了调试前所需的理论准备,包括PJSIP架构、网络电话故障类型及调试环境搭建。随后,文章深入探讨了在Qt Creator中进行PJSIP调试的实践,涵盖日志分析、调试工具使用以及调试技巧和故障排除。此外,

多项式相关定理的推广与算法研究

### 多项式相关定理的推广与算法研究 #### 1. 定理中 $P_j$ 顺序的优化 在相关定理里,$P_j$ 的顺序是任意的。为了使得到的边界最小,需要找出最优顺序。这个最优顺序是按照 $\sum_{i} \mu_i\alpha_{ij}$ 的值对 $P_j$ 进行排序。 设 $s_j = \sum_{i=1}^{m} \mu_i\alpha_{ij} + \sum_{i=1}^{m} (d_i - \mu_i) \left(\frac{k + 1 - j}{2}\right)$ ,定理表明 $\mu f(\xi) \leq \max_j(s_j)$ 。其中,$\sum_{i}(d_i

以客户为导向的离岸团队项目管理与敏捷转型

### 以客户为导向的离岸团队项目管理与敏捷转型 在项目开发过程中,离岸团队与客户团队的有效协作至关重要。从项目启动到进行,再到后期收尾,每个阶段都有其独特的挑战和应对策略。同时,帮助客户团队向敏捷开发转型也是许多项目中的重要任务。 #### 1. 项目启动阶段 在开发的早期阶段,离岸团队应与客户团队密切合作,制定一些指导规则,以促进各方未来的合作。此外,离岸团队还应与客户建立良好的关系,赢得他们的信任。这是一个奠定基础、确定方向和明确责任的过程。 - **确定需求范围**:这是项目启动阶段的首要任务。业务分析师必须与客户的业务人员保持密切沟通。在早期,应分解产品功能,将每个功能点逐层分

嵌入式平台架构与安全:物联网时代的探索

# 嵌入式平台架构与安全:物联网时代的探索 ## 1. 物联网的魅力与挑战 物联网(IoT)的出现,让我们的生活发生了翻天覆地的变化。借助包含所有物联网数据的云平台,我们在驾车途中就能连接家中的冰箱,随心所欲地查看和设置温度。在这个过程中,嵌入式设备以及它们通过互联网云的连接方式发挥着不同的作用。 ### 1.1 物联网架构的基本特征 - **设备的自主功能**:物联网中的设备(事物)具备自主功能,这与我们之前描述的嵌入式系统特性相同。即使不在物联网环境中,这些设备也能正常运行。 - **连接性**:设备在遵循隐私和安全规范的前提下,与同类设备进行通信并共享适当的数据。 - **分析与决策

分布式系统中的共识变体技术解析

### 分布式系统中的共识变体技术解析 在分布式系统里,确保数据的一致性和事务的正确执行是至关重要的。本文将深入探讨非阻塞原子提交(Nonblocking Atomic Commit,NBAC)、组成员管理(Group Membership)以及视图同步通信(View - Synchronous Communication)这几种共识变体技术,详细介绍它们的原理、算法和特性。 #### 1. 非阻塞原子提交(NBAC) 非阻塞原子提交抽象用于可靠地解决事务结果的一致性问题。每个代表数据管理器的进程需要就事务的结果达成一致,结果要么是提交(COMMIT)事务,要么是中止(ABORT)事务。

【高级图像识别技术】:PyTorch深度剖析,实现复杂分类

![【高级图像识别技术】:PyTorch深度剖析,实现复杂分类](https://www.pinecone.io/_next/image/?url=https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttps%2Fcdn.sanity.io%2Fimages%2Fvr8gru94%2Fproduction%2Fa547acaadb482f996d00a7ecb9c4169c38c8d3e5-1000x563.png&w=2048&q=75) # 摘要 随着深度学习技术的快速发展,PyTorch已成为图像识别领域的热门框架之一。本文首先介绍了PyTorch的基本概念及其在图像识别中的应用基础,进而深入探讨了PyTorch的深度学习

C#资源管理优化:提升变色球游戏内存效率

# 摘要 本文详细探讨了C#编程语言中资源管理和内存管理的基础知识、机制、常见问题以及性能优化策略。通过对C#内存分配与回收机制的分析,包括堆内存与栈内存的差异及垃圾回收原理,文章进一步深入讨论了内存泄漏和内存溢出的识别、预防和调试技术。接着,结合变色球游戏性能优化实践,详细阐述了资源使用分析、内存使用优化技术以及性能优化案例,展示了从理论到实践的应用转化。同时,本文也探讨了在C#中选择和应用高效数据结构的策略,以及分析数据结构内存效率的方法。最后,针对C#高级内存管理技术,研究了垃圾回收的高级话题和内存管理的进阶技巧,并针对特定应用场景提出了优化方案。整体而言,本文为C#开发者提供了全面的资

未知源区域检测与子扩散过程可扩展性研究

### 未知源区域检测与子扩散过程可扩展性研究 #### 1. 未知源区域检测 在未知源区域检测中,有如下关键公式: \((\Lambda_{\omega}S)(t) = \sum_{m,n = 1}^{\infty} \int_{t}^{b} \int_{0}^{r} \frac{E_{\alpha,\alpha}(\lambda_{mn}(r - t)^{\alpha})}{(r - t)^{1 - \alpha}} \frac{E_{\alpha,\alpha}(\lambda_{mn}(r - \tau)^{\alpha})}{(r - \tau)^{1 - \alpha}} g(\

分布式应用消息监控系统详解

### 分布式应用消息监控系统详解 #### 1. 服务器端ASP页面:viewAllMessages.asp viewAllMessages.asp是服务器端的ASP页面,由客户端的tester.asp页面调用。该页面的主要功能是将消息池的当前状态以XML文档的形式显示出来。其代码如下: ```asp <?xml version="1.0" ?> <% If IsObject(Application("objMonitor")) Then Response.Write cstr(Application("objMonitor").xmlDoc.xml) Else Respo

WPF文档处理及注解功能深度解析

### WPF文档处理及注解功能深度解析 #### 1. 文档加载与保存 在处理文档时,加载和保存是基础操作。加载文档时,若使用如下代码: ```csharp else { documentTextRange.Load(fs, DataFormats.Xaml); } ``` 此代码在文件未找到、无法访问或无法按指定格式加载时会抛出异常,因此需将其包裹在异常处理程序中。无论以何种方式加载文档内容,最终都会转换为`FlowDocument`以便在`RichTextBox`中显示。为研究文档内容,可编写简单例程将`FlowDocument`内容转换为字符串,示例代码如下: ```c