惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
NISL@THU
NISL@THU
T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
Lohrmann on Cybersecurity
V
Visual Studio Blog
Cyberwarzone
Cyberwarzone
D
Docker
The Hacker News
The Hacker News
C
CERT Recently Published Vulnerability Notes
Vercel News
Vercel News
Project Zero
Project Zero
S
Schneier on Security
aimingoo的专栏
aimingoo的专栏
I
Intezer
腾讯CDC
M
MIT News - Artificial intelligence
Hugging Face - Blog
Hugging Face - Blog
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
AWS News Blog
AWS News Blog
GbyAI
GbyAI
MongoDB | Blog
MongoDB | Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
Vulnerabilities – Threatpost
G
Google Developers Blog
N
Netflix TechBlog - Medium
The Cloudflare Blog
Microsoft Security Blog
Microsoft Security Blog
Y
Y Combinator Blog
A
Arctic Wolf
S
Securelist
酷 壳 – CoolShell
酷 壳 – CoolShell
Cisco Talos Blog
Cisco Talos Blog
Recent Announcements
Recent Announcements
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LINUX DO - 热门话题
T
Threatpost
Latest news
Latest news
Blog — PlanetScale
Blog — PlanetScale
Security Latest
Security Latest
Engineering at Meta
Engineering at Meta
大猫的无限游戏
大猫的无限游戏
H
Help Net Security
The GitHub Blog
The GitHub Blog
T
Tor Project blog
P
Proofpoint News Feed

博客园 - 同一片海

Win10 资源管理器窗口无边框的问题 Android Studio发布Release版本之坑--Unknown host 'd29vzk4ow07wi7.cloudfront.net' 浏览器外部署Silverlight更新检查失败的原因及对策 C#调用非托管Dll时的参数传递 使用ATL开发ActiveX控件 大数据量传输时配置WCF的注意事项 在Silverlight 3中使用主题 [Silverlight]Selector类到底有没有SelectedValue属性? WCF安全之ASP.NET兼容模式 WCF安全之customBinding [Silverlight]AutoCompleteBox控件的一个Bug? [Silverlight]一个简单的GroupBox控件 [Silverlight]DataGrid相关的几个小知识点 实现下拉列表支持DataGrid的AutoCompleteBox 可分片数据持久层-ShardingPL使用说明 Silverlight数据绑定中的可空类型与自定义转换器 一个丑陋的对Silverlight中的Grid无CellPadding的解决方案 Silverlight中的资源文件 - 同一片海 - 博客园 【分享】SqlServer数据库文档生成工具
Silverlight自定义主题
同一片海 · 2010-06-08 · via 博客园 - 同一片海

在Silverlight 3中使用主题》一文中已经对在Silverlight中使用ToolKit提供的主题做了介绍,本文将介绍在Silverlight中实现并使用自定义主题。

有时候我们可能想开发一套具有特色的主题而不是采用ToolKit提供的默认主题,或者我们可能只是为了统一程序的风格而做一些统一处理(例如将所有TextBlock的Margin定义为5),这时我们就需要自定义主题。使用自定义主题时同样需要添加对Silverlight ToolKit中的System.Windows.Controls.Theming.Toolkit程序集的引用。

以下是实现并使用自定义主题的几种方式:

一、使用自定义主题文件

实现步骤:

1、在项目中添加新项,并选择“Silverlight 资源字典”模板。

本示例添加的主题资源文件名为“CustomTheme.xaml”。

注意:需要将添加的主题资源文件的生成操作设置为“内容”。

2、在主题资源文件中添加样式。

注意:添加样式时只需指定TargetType属性,无需也不能指定 x:Key。

CustomTheme.xaml源码:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style TargetType="Button">
        <Setter Property="Foreground" Value="Red"></Setter>
    </Style>

    <Style TargetType="TextBox">
        <Setter Property="Foreground" Value="Red"></Setter>
    </Style>

</ResourceDictionary>

3、使用ImplicitStyleManager类提供的附加属性将样式应用到控件

MainPage.xaml源码:

<UserControl 
    x:Class="ThemeSample.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Theming="clr-namespace:System.Windows.Controls.Theming;assembly=System.Windows.Controls.Theming.Toolkit" >
    <StackPanel x:Name="LayoutRoot" Width="160" Margin="100"
                    Theming:ImplicitStyleManager.ApplyMode="Auto" 
                    Theming:ImplicitStyleManager.ResourceDictionaryUri= "Themes/CustomTheme.xaml">
        <Button Content="Button" Margin="10" ></Button>
        <TextBox Text="TextBox" Margin="10"></TextBox>
    </StackPanel>
</UserControl>

效果预览:

image

二、自定义主题控件

如果想将自定义主题以程序集的方式发布并提供给第三方使用,就需要自定义主题控件。

本示例将以第一种方式所添加的样式文件做为基础实现一个自定义主题控件。

实现步骤:

1、将CustomTheme.xaml文件的生成操作设置为“嵌入的资源”。

2、在项目中添加类,并将类定义为从System.Windows.Controls.Theming.Theme类继承。

本示例添加的类名为CustomTheme。

3、为类添加默认构造函数并为基类的构造函数提供参数。

CustomTheme.cs源码:

using System.Windows.Controls.Theming;

namespace ThemeSample
{
    public class CustomTheme : Theme
    {
        public CustomTheme()
            : base(typeof(CustomTheme).Assembly, "ThemeSample.Themes.CustomTheme.xaml")
        {}
    }
}

注意主题资源文件的写法类似于命名空间+文件名,而不是普通路径。

4、使用自定义主题控件。

MainPage.xaml源码:

<UserControl 
    x:Class="ThemeSample.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:ThemeSample">
    <local:CustomTheme>
        <StackPanel x:Name="LayoutRoot" Width="160" Margin="100">
            <Button Content="Button" Margin="10" ></Button>
            <TextBox Text="TextBox" Margin="10"></TextBox>
        </StackPanel>
    </local:CustomTheme>
</UserControl>

使用自定义主题控件后的效果与使用第一种方式的效果一致,此处不再展示效果图。