WPF 样式和资源

样式Style的使用


控件的Sytle属性可以赋予附带Setter的Style元素。Setter元素定义Property和Value属性,并给指定的属性设置一个值。


直接通过Button控件设置Style,设置Background,FontSize,FontWeight属性。把Style设置TargetType为Button,以便直接访问Button的属性。

        <Button Width="150" Height="50" Content="Click Me!">
            <Button.Style>
                <Style TargetType="Button">
                    <Setter Property="Background" Value="Yellow"/>
                    <Setter Property="FontSize" Value="14"/>
                    <Setter Property="FontWeight" Value="Bold"/>
                </Style>
            </Button.Style>
        </Button>

如果没有设置样式的TargtType,就可以通过Button.Background,Button.FontSize访问属性。如果需要设置不同元素类型的属性时,这就很重要。

        <Button Width="150" Height="50" Content="Click Me!">
            <Button.Style>
                <Style>
                    <Setter Property="Button.Background" Value="Yellow"/>
                    <Setter Property="Button.FontSize" Value="14"/>
                    <Setter Property="Button.FontWeight" Value="Bold"/>
                </Style>
            </Button.Style>
        </Button>


样式可以放在资源中,以实现共享的目的。

第一种样式赋予了Button类型的所有元素。把一个样式赋予某一类型的所有元素,使用Style的TargetType属性,并指定x:Type

第二种样式使用一个键,x:Key    单一元素组件可以引用此样式

    <Window.Resources>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Background" Value="Yellow"/>
            <Setter Property="FontSize" Value="18"/>
        </Style>
        
        <Style x:Key="BtnSytle">
            <Setter Property="Button.Background" Value="Red"/>
            <Setter Property="Button.FontSize" Value="18"/>
        </Style>
    </Window.Resources>
两种样式的使用,第一个按钮没有指定样式属性,而是使用的Button类型定义的样式,第二个按钮指定了Style并使用StaticResource指定了样式资源的键值BtnStyle

        <StackPanel Orientation="Vertical">
            <Button Width="150" Height="50" Content="Click Me!"/>
            <Button Width="150" Height="50" Content="Click Me!" Style="{StaticResource BtnSytle}"/>
        </StackPanel>


资源

样式通常存储在资源中。

基类FrameworkElement定义ResourceDictionary类型的Resources属性。所有派生自FrameworkElement所有类(任意WPF元素)都可以定义Resources资源。

上面示例资源用Window元素定义,它就会应用于Window的所有子元素,同理可以单独设置Grid,StackPanel等元素的资源,它就会应用于当前元素的所有子元素。


如果需要将一个样式应用于多个窗口,就可以用应用程序定义样式。在App.xaml中可定义应用程序的全局资源。

<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Startup="Application_Startup">
    <Application.Resources>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Background" Value="Yellow"/>
            <Setter Property="FontSize" Value="18"/>
        </Style>

        <Style x:Key="BtnSytle">
            <Setter Property="Button.Background" Value="Red"/>
            <Setter Property="Button.FontSize" Value="18"/>
        </Style>

    </Application.Resources>
</Application>


从代码中访问资源

基类FrameworkElement实现FindResource()方法,所以每个WPF元素对象调用FindResource()方法,按照层次结构搜索资源。

        <StackPanel Orientation="Vertical">
            <StackPanel.Resources>
                <Style x:Key="BtnStyle">
                    <Setter Property="Button.Background" Value="Red"/>
                    <Setter Property="Button.FontSize" Value="18"/>
                </Style>
            </StackPanel.Resources>
            <Button Width="150" Height="50" Content="Click Me!" Click="Button_Click" Focusable="False"/>
        </StackPanel>

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Control ctrl = sender as Control;
            ctrl.Style = ctrl.FindResource("BtnStyle") as Style;
        }


动态资源

StaticResource标记扩展,是在加载期间搜索资源。如果在运行程序过程中改变了资源,就应该使用DynamicResource标记扩展


资源字典

如果相同的资源可用于不同的应用程序,把资源放在一个资源字典中比较有效。使用资源字典可以在多个应用程序之间共享文件。也可以吧资源字典放在一个程序集中,供应用程序共享。

创建资源字典:右击项目-添加-资源字典

创建Dictionary1.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type Button}">
            <Setter Property="Background" Value="Yellow"/>
            <Setter Property="FontSize" Value="18"/>
        </Style>

        <Style x:Key="BtnSytle">
            <Setter Property="Button.Background" Value="Red"/>
            <Setter Property="Button.FontSize" Value="18"/>
        </Style>
</ResourceDictionary>

对应目标项目,需要把此资源字典添加到App.xaml中引用。使用方式就跟在App声明全局资源一样。

<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Startup="Application_Startup">
    <Application.Resources>
       
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Dictionary1.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
        
    </Application.Resources>
</Application>

通过ResourceDirectionary的MergedDictionayies属性,可以添加多个资源字典文件。




ModernUI(http://mui.codeplex.com/)是一个开源的WPF界面库,利用该界面库,我们可以创建很酷的应用程序。下面是ModernUI官方示例,你可以从官方网站直接下载源码运行,如果是.NET 4.0的话,记得要声明“NET4”预编译变量,否则无法编译通过。 这个界面框架是基于ModernUI来实现的,在该文我将分享所有的源码,并详细描述如何基于ModernUI来构造一个非常通用的、插件化的WPF开发框架。下载源码的同志,希望点击一下推荐。 本文将按照以下四点来介绍: (1)ModernUI简介; (2)构建通用界面框架的思路; (3)基于ModernUIOSGi.NET的插件化界面框架实现原理及源码分析; (4)其它更有趣的东西~~。 要编写这样的WPF界面,我们需要在一个Window上声明菜单Tab页面,下图是定义菜单的声明。 此外,每一个Tab风格页面,你也需要手动的为菜单创建这样的界面元素。 直接用这样的方式来使用ModernUI,显然不太适合团队协作性的并行开发,因为在一个团队的协作中,不同的人需要完成不同的功能,实现不同页面,每个人都需要来更改主界面。 我非常希望模块化的开发方法,因为这可以尽可能的复用现有资产,使程序员可以聚焦在自己关注的业务逻辑上,不需要关心UI的使用。下面,我将来描述基于ModernUI实现的一个通用界面框架,这个界面框架允许程序员在自己的业务模块中配置需要显示的界面元素。 通用界面框架实现思路: 我希望能够实现这样的通用界面框架: (1)程序员可以直接实现需要展现业务逻辑的界面,不需要关注如何使用ModernUI; (2)程序员可以通过简单的配置就可以将自己实现的业务逻辑页面显示在主界面中; (3)这个界面框架可以完全复用。 当我看到ModernUI这个界面库时,我希望将应用程序做成模块化,每一个模块能够: (1)通过以下配置能够直接显示二级菜单。 (2)通过以下配置能够直接显示三级菜单。 这样做的好处是,开发插件的时候可以不需要关心界面框架插件;团队在协作开发应用的时候,可以独立开发并不需要修改主界面;团队成员的插件可以随时集成到这个主界面;当主界面无法满足我们的布局时或者用户需求无法满足时,可以直接替换主界面框架而不需要修改任何插件代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值