关于WPF样式和资源

在WPF的开发中,是不是感觉默认的控件样式有点单一和乏味呢,它们能满足我们的功能要求,但是单一的样式却让我们产生了视觉上的乏味,于是我们的自定义样式就出来了,自定义样式是什么呢,通俗的说就是我们自己为控件定义它们的样式,就像Button,有圆形的,椭圆的,长方形的,又或者是多边形的,下面就让我们了解一下样式和自定义样式吧……

 

  • 样式

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

在这里呢,我只是简单的定义了它的一些边框和字体颜色

 

在这里呢,我只是简单的定义了它的一些边框和字体颜色

 

<Style TargetType="Button">

<Setter Property="Background" Value="#e4c6d4"/><!--按钮的颜色-->

<Setter Property="BorderBrush" Value="White"/><!--边框的颜色-->

<Setter Property="BorderThickness" Value="1,1,1,1"/><!--边框的宽度-->

<Setter Property="Foreground" Value="White"/><!--字体的颜色-->

</Style>

 

 <Button Width="100" Height="30" Margin="10,105,333.2,135.4" Content="按钮一"/>

 <Button Margin="10,151,333.2,89.4" Content="按钮二"/>

 

如图所示:

关于WPF样式和资源

样式可以放在资源中。在资源中,可以把样式赋予指定的元素,把一个样式赋予某一类型的所有元素,或者为该样式使用一个键。要把样式赋予某一类型的所有元素,可使用Style的TargetType属性,指定X:Type标记扩展{x:Type Button},从而将样式赋予一个按钮,要定义需要引用的样式,必须设置x:Key。

 

除了把按钮的Background设置单种颜色外,还可以将Background属性设置为定义了渐变色的LinearGradientBursh。可以设置多种颜色渐变。

 

 <Style x:Key="One">

            <Setter Property="Button.FontSize" Value="15"/>

            <Setter Property="Button.Background">

                <Setter.Value>

<!--线性渐变-->

                    <LinearGradientBrush >

                        <GradientStop Color="#e4c6d4" Offset="0"/>

                        <GradientStop Color="SkyBlue" Offset="1"/>

                    </LinearGradientBrush>

                </Setter.Value>

            </Setter>

        </Style>

 

 <Button Style="{StaticResource One}" Margin="10,105,333.2,135.4" Content="按钮一"/

如图所示:

关于WPF样式和资源

 

  • 资源

从样式实例中可以看出,样式通常存储在资源中。可以在资源中定义任何可冻结的元素。

目的是为了实现对象的重复使用,有助于XAML代码重用,有助于应用维护的一致性。

 

<Window.Resources>

        <Style TargetType="Button">

            <Setter Property="Background" Value="#e4c6d4"/>

            <Setter Property="BorderBrush" Value="White"/>

            <Setter Property="BorderThickness" Value="1,1,1,1"/>

            <Setter Property="Foreground" Value="White"/>

        </Style>

</Window.Resources>

 <Button Margin="10,105,333.2,135.4" Content="按钮二"/>

这里,资源用Window定义,它会应用于Window的所有子元素。如果Window包含一个Grid,且该Grid包含一个StackPanel,同时如果资源是用StackPanel定义的,该资源就会应用于StackPanel中的所有控件。如果StackPanel包含一个按钮,但只用该按钮定义资源,这个样式就只对该按钮有效。

 

如果需要将同一个样式应用于多个窗口,就可以用应用程序定义样式。在WPF项目中创建一个App.xaml文件,已定义应用程序的全局资源。应用程序样式对其中的每个窗口都有效;

一般在创建一个新的WPF项目时就会自动生成App.xaml文件的了。

 

<Application x:Class="MeDemo.App"

            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

            xmlns:local="clr-namespace:MeDemo"

            StartupUri="MainWindow.xaml">

    <Application.Resources>

        

    </Application.Resources>

</Application>

 

资源字典

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

要共享程序集中的资源字典。首先要创建一个资源字典。

第一步:在项目中右键—》添加—》资源字典,然后给资源字典命名就可以了。

关于WPF样式和资源

添加成功后就可以在里面写自己的样式了。(建议先在Window窗口调试完后再复制过来,因为资源字典是看不见实际样式的。命名的时候要用英文命名,不要学我用中文!我的是为了方便理解)

 

 
 

        <Setter Property="Button.BorderBrush" Value="White"/>

        <Setter Property="Button.Foreground" Value="White" />

        <Setter Property="Button.Background">

            <Setter.Value>

                <LinearGradientBrush >

                    <GradientStop Color="#e4c6d4" Offset="0"/>

                    <GradientStop Color="SkyBlue" Offset="1"/>

                </LinearGradientBrush>

            </Setter.Value>

        </Setter>

</Style>

</ResourceDictionary>

</ResourceDictionary>

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

                   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

                   xmlns:local="clr-namespace:MeDemo.样式资源">

                  <!--编写自定义的样式-->

<Style TargetType="Button">

        <Setter Property="Button.FontSize" Value="15"/>

       

第二步:编写完后就合并资源字典属性

 

Application x:Class="MeDemo.App"

            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

             xmlns:local="clr-namespace:MeDemo"

            StartupUri="MainWindow.xaml">

    <Application.Resources>

        <!--Resource Dictionary –资源字典-->

        <!--所有的资源项在最终都会被整合到Resource Dictionary中的,

        也就是说无论是FrameworkElement的Resources,还是Window的Resources,还是Application的Resources,

        还是特定的ResourceDictionary中定义的resources在整个应用编译执行的时候实际上他们都在一起的作为可遍历集合共同存在于一个相对会话空间内的。

        我们也提到过Resource的key是可以被允许有相同的,这样在遍历不同相对地址的Resource Dictionary时会根据StaticResource或者DynamicResource的lookup

        behavior来确定哪个有效。通常为了维护和灵活性的考虑,我们通常会将Resource Dictionary文件分成好几个,但在某些场合下我们只需要用其中某些资源,

        那么我么可以将资源从几个独立的文件中提取并合并.-->

        <ResourceDictionary>

            <!--给应用程序添加默认资源:其实就是将默认的Resource Dictionary加入到Application的全局Resource里边。-->

            <ResourceDictionary.MergedDictionaries>

                <!--封装好的公共样式-->

                <ResourceDictionary Source="样式资源/资源字典.xaml"/>

            </ResourceDictionary.MergedDictionaries>

        </ResourceDictionary>

    </Application.Resources>

</Application>

 

 

第三步:创建一个新的窗口,根据你编写的资源字典,比如你编写了一个Button的样式,那么我们就编写一个Button控件,然后就可以看到你自己所写样式的模样了。

 

     <Window x:Class="MeDemo.资源字典调试"

       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

       xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

       xmlns:local="clr-namespace:MeDemo"

       mc:Ignorable="d"

       Title="资源字典调试" Height="300" Width="300">

    <Grid>

        <Button Width="150" Height="30" Content="资源字典"/>

    </Grid>

</Window>

 

 

效果如图所示:

      链接

发表平台