WPF中样式

这篇具有很好参考价值的文章主要介绍了WPF中样式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WPF中样式:类似于winform中控件的属性

<Grid>
        <!-- Button属性 字体大小 字体颜色 内容 控件宽 高 -->
        <Button FontSize="20" Foreground="Blue" Content="Hello" Width="100" Height="40"/>
    </Grid>

 效果如下: 

WPF中样式,wpf 如果要创建多个相似效果的按钮,就需要将该属性写多次,虽然也能达到相同的效果;但是费力。

<Grid>
        <StackPanel>
            <!-- Button属性 字体大小 字体颜色 内容 控件宽 高 -->
            <Button FontSize="20" Foreground="Blue" Content="Hello" Width="100" Height="40"/>
            <Button FontSize="20" Foreground="Blue" Content="Hello" Width="100" Height="40"/>
            <Button FontSize="20" Foreground="Blue" Content="Hello" Width="100" Height="40"/>
        </StackPanel>
    </Grid>

 效果如下: 

WPF中样式,wpf

因此,首先想到的是早轮子重复使用。需要通过Style。

创建样式的步骤:

  • 在Window.Resources中创建样式
  • 给每个样式声明一个键Key,一个样式的名称而已
  • 给每个样式声明一个目标类型TargetType,例如Button
  • 设置属性:(Button为例)
  • 字体大小FontSize
  • 背景颜色Background
  • 字体颜色Foreground,边距Margin
  • 水平位置HorizontalAlignment,垂直位置VerticalAlignment

样式是组织和重用以上的重要工具。不是使用重复的标记填充XAML,通过Styles创建一系列封装所有这些细节的样式。它也是模板(Template)、触发器(Trigger)的基础。

    <Window.Resources>
        <Style x:Key="defaultStyle" TargetType="Button">
            <Setter Property="FontSize" Value="30"/>
            <Setter Property="Foreground" Value="Blue"/>
            <Setter Property="Width" Value="100"/>
            <Setter Property="Height" Value="40"/>
        </Style>
    </Window.Resources>
    
    <Grid>
        <StackPanel>
            <Button Style="{StaticResource defaultStyle}" Content="Hello"/>
            <Button Style="{StaticResource defaultStyle}" Content="Hello"/>
            <Button Style="{StaticResource defaultStyle}" Content="Hello"/>
        </StackPanel>
    </Grid>

 效果如下:WPF中样式,wpf

查询Style源代码:

namespace System.Windows
{
    //
    // 摘要:
    //     启用的属性、 资源和事件处理程序的一种类型的实例之间共享。
    [ContentProperty("Setters")]
    [DictionaryKeyProperty("TargetType")]
    [Localizability(LocalizationCategory.Ignore)]
    public class Style : DispatcherObject, INameScope, IAddChild, ISealable, IHaveResources, IQueryAmbient
    {
        //
        // 摘要:
        //     初始化 System.Windows.Style 类的新实例。
        public Style();
        //
        // 摘要:
        //     新实例初始化 System.Windows.Style 类,用于对指定 System.Type。
        //
        // 参数:
        //   targetType:
        //     该样式将应用于哪个类型。
        public Style(Type targetType);
        //
        // 摘要:
        //     新实例初始化 System.Windows.Style 类,用于对指定 System.Type 并根据指定 System.Windows.Style。
        //
        // 参数:
        //   targetType:
        //     该样式将应用于哪个类型。
        //
        //   basedOn:
        //     要基于此样式的样式。
        public Style(Type targetType, Style basedOn);

        //
        // 摘要:
        //     获取一个值,该值指示是否样式是只读的并且不能更改。
        //
        // 返回结果:
        //     true 如果样式密封的;,否则为 false。
        public bool IsSealed { get; }
        //
        // 摘要:
        //     获取或设置此样式所针对的类型。
        //
        // 返回结果:
        //     此样式目标类型。
        [Ambient]
        [Localizability(LocalizationCategory.NeverLocalize)]
        public Type TargetType { get; set; }
        //
        // 摘要:
        //     获取或设置是当前样式的基础已定义的样式。
        //
        // 返回结果:
        //     已定义的样式,其当前样式的基础。 默认值为 null。
        [Ambient]
        [DefaultValue(null)]
        public Style BasedOn { get; set; }
        //
        // 摘要:
        //     获取一套 System.Windows.TriggerBase 应用属性值的对象根据指定的条件。
        //
        // 返回结果:
        //     System.Windows.TriggerBase 对象的集合。 默认值为空集合。
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public TriggerCollection Triggers { get; }
        //
        // 摘要:
        //     获取一套 System.Windows.Setter 和 System.Windows.EventSetter 对象。
        //
        // 返回结果:
        //     一套 System.Windows.Setter 和 System.Windows.EventSetter 对象。 默认值为空集合。
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public SetterBaseCollection Setters { get; }
        //
        // 摘要:
        //     获取或设置此样式的作用域内的可用资源的集合。
        //
        // 返回结果:
        //     可以使用此样式的作用域内的资源。
        [Ambient]
        public ResourceDictionary Resources { get; set; }

        //
        // 摘要:
        //     返回此 System.Windows.Style 的哈希代码。
        //
        // 返回结果:
        //     此 System.Windows.Style 的哈希代码。
        public override int GetHashCode();
        //
        // 摘要:
        //     在当前的名称范围中注册新的名称对象对。
        //
        // 参数:
        //   name:
        //     要注册的名称。
        //
        //   scopedElement:
        //     要映射到指定的对象 name。
        public void RegisterName(string name, object scopedElement);
        //
        // 摘要:
        //     锁定此样式和所有工厂和触发器,使它们不能进行更改。
        public void Seal();
        //
        // 摘要:
        //     从名称范围中移除名称对象映射。
        //
        // 参数:
        //   name:
        //     要删除的映射的名称。
        public void UnregisterName(string name);
    }
}
  • TargetType:Style的作用类型,例如Button。
  • BaseOn:继承已有的样式。
  • TriggerCollection:触发器集合。
  • SetterBaseCollection:属性集合。
  • ResourceDictionary:资源字典,比如笔刷,样式。

样式的作用:样式可以包含多个属性(样式管理属性集合),并批量作用于对象(不用写过多重复代码),也可以用于继承。

    <Window.Resources>
        <Style TargetType="Button">
            <Setter Property="FontSize" Value="25"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="Background" Value="Black"/>
            <Setter Property="Content" Value="Button"/>
        </Style>
    </Window.Resources>
    
    <Grid>
        <UniformGrid Columns="3" Rows="3">
            <Button />
            <Button />
            <Button />

            <Button />
            <Button />
            <Button />

            <Button />
            <Button />
            <Button />
        </UniformGrid>
    </Grid>

 效果如下:WPF中样式,wpf

给样式起名字,并在作用对象中使用该样式:

    <Window.Resources>
        <Style x:Key="ButtonStyle" TargetType="Button">
            <Setter Property="FontSize" Value="25"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="Background" Value="Black"/>
            <Setter Property="Content" Value="Button"/>
        </Style>
    </Window.Resources>
    
    <Grid>
        <UniformGrid Columns="3" Rows="3">
            <Button Style="{StaticResource ButtonStyle}"/>
            <Button Style="{StaticResource ButtonStyle}"/>
            <Button Style="{StaticResource ButtonStyle}"/>

            <Button Style="{StaticResource ButtonStyle}"/>
            <Button Style="{StaticResource ButtonStyle}"/>
            <Button Style="{StaticResource ButtonStyle}"/>

            <Button Style="{StaticResource ButtonStyle}"/>
            <Button Style="{StaticResource ButtonStyle}"/>
            <Button Style="{StaticResource ButtonStyle}"/>
        </UniformGrid>
    </Grid>

 效果如下:WPF中样式,wpf 

样式继承

    <Window.Resources>
        <Style x:Key="baseButtonStyle" TargetType="Button">
            <Setter Property="FontSize" Value="30"/>
            <Setter Property="Foreground" Value="Blue"/>
        </Style>

        <Style x:Key="defaultButtonStyle1" TargetType="Button" BasedOn="{StaticResource baseButtonStyle}">
            <Setter Property="Width" Value="100"/>
            <Setter Property="Height" Value="40"/>
        </Style>

        <Style x:Key="defaultButtonStyle2" TargetType="Button" BasedOn="{StaticResource baseButtonStyle}">
            <Setter Property="Width" Value="100"/>
            <Setter Property="Height" Value="50"/>
        </Style>
    </Window.Resources>
    
    <Grid>
        <StackPanel>
            <!-- Button属性 字体大小 字体颜色 内容 控件宽 高 -->
            <Button Style="{StaticResource defaultButtonStyle1}" Content="Hello"/>
            <Button Style="{StaticResource defaultButtonStyle2}" Content="Hello"/>
            <Button Style="{StaticResource defaultButtonStyle2}" Content="Hello"/>
        </StackPanel>
    </Grid>

效果如下: 

WPF中样式,wpf

控件模板ControlTemplate

视图->其他->文档大纲

右键按钮->编辑模板->编辑副本

产生按钮模板:

<Window.Resources>
        <Style x:Key="FocusVisual">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/>
        <SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/>
        <SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/>
        <SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/>
        <SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/>
        <SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/>
        <SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>
        <SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/>
        <SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/>
        <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
            <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
            <Setter Property="Background" Value="{StaticResource Button.Static.Background}"/>
            <Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/>
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="HorizontalContentAlignment" Value="Center"/>
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="Padding" Value="1"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
                            <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsDefaulted" Value="true">
                                <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
                                <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="true">
                                <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
                                <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/>
                                <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
                                <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

Content Presenter使得按钮可以承载很多内容。文章来源地址https://www.toymoban.com/news/detail-830777.html

到了这里,关于WPF中样式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WPF 入门笔记 - 03 - 样式基础

    ? 程序的本质 - 数据结构 + 算法 ? ?本篇为学习李应保老师所著的《WPF专业编程指南》并搭配 WPF 开发圣经《WPF编程宝典第4版》以及痕迹大佬《WPF入门基础教程系列》文章所作笔记,对应《WPF专业编程指南》第 9 章之间内容,主要概述 WPF 中关于样式的相关内容,希望可以帮到

    2024年02月08日
    浏览(44)
  • WPF下拉框ComboBox样式

    显示效果下图: 1、静态显示如图1,悬浮如图2 2、下拉的Popup带阴影(无Border);下拉三角图标用的是自己的png图片,可任意替换(其他或Path数据等自己处理);宽高等可直接在样式代码里修改。 3、实际项目里,对下拉的滚动条做了美化处理,此处没附带上相关代码。有需

    2024年02月16日
    浏览(40)
  • 更改wpf原始默认按钮的样式

    2024年01月23日
    浏览(31)
  • (六)WPF - 资源和样式行为(1)

    1、资源集合 每个元素都有一个 Resources 属性,该属性存储了一个资源字典集合(它是 Resource Dictionary 类的实例)。资源集合可以包含任意类型的对象,并根据字符串编写索引。 为了使用 XML 标记中的资源,需要一种引用资源的方法。这是通过标记扩展完成的。 有两个标记扩

    2024年02月10日
    浏览(40)
  • WPF自定义TreeView滚动条样式

      根据客户需求,要在TreeView目录树上显示10万+个节点,但是目录树显示10万加节点后,整个页面操作起来非常卡,所以给目录树增加了虚拟化设置。但是虚拟化设置一直没生效,后来经过排查发现是使用的自定义滚动条导致了虚拟化设置没有生效,后来自己写了一个滚动条样

    2024年02月14日
    浏览(29)
  • WPF 入门笔记 - 03 - 样式基础及模板

    🍟 程序的本质 - 数据结构 + 算法 🍟 本篇为学习李应保老师所著的《WPF专业编程指南》并搭配 WPF 开发圣经《WPF编程宝典第4版》以及痕迹大佬《WPF入门基础教程系列》文章所作笔记,对应《WPF专业编程指南》第 9-10 章之间内容,主要概述 WPF 中关于样式及模板部分的梳理及应

    2024年02月08日
    浏览(41)
  • WPF 自定义DataGrid控件样式模板5个

    样式一: 样式代码: 初始化绑定数据C#代码: 效果展示: 样式二: 上面的代码实现了隔行换色的效果,但是没有鼠标选中效果。另外有些用户希望能够进行列头拖动及排序。那么就需要做以下更改: 添加DataGridRow样式: 在引用时,设置DataGrid的RowStyle=\\\"{StaticResource AlertCoun

    2023年04月27日
    浏览(43)
  • 使用arcgis pro是类似的控件样式 WPF

    2024年01月18日
    浏览(39)
  • wpf RadioButton自定义样式 圆角/直角变化 背景色渐变

    样式部分 xam  根据  CommandParameter 的value不同,背景圆角的方向不同 效果如    

    2024年02月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包