WPF仿网易云搭建笔记(6):Style进阶详解

文章目录

专栏和Gitee仓库

WPF仿网易云 Gitee仓库
WPF仿网易云 CSDN博客专栏

前言

WPF想要批量设置样式属性,一共有3个方法

  • Style样式
  • Template控件模板
  • DataTemplate数据模板

WPF 零基础入门笔记(2):控件模板+数据模版

WPF控件模板需要整个重绘,难度过大。WPF数据模板是批量生成,灵活性太低,而且不好看预览效果。

所以我们这样要用到WPF的Style

Style

博客园 痕迹g WPF样式与触发器(3)

简单使用

这里不展开说,太简单了

xml 复制代码
    <!--如果是Window就是Window.Resource。如果是UserControl就是UserControl.Resource-->
    <Window.Resources>
        <!--设置样式 TargetType指向类型,x:Key是样式的命名-->
        <Style x:Key="ContentBorder"
               TargetType="Border">
            <Setter Property="BorderBrush"
                    Value="Black" />
            <Setter Property="BorderThickness"
                    Value="3" />
        </Style>
    </Window.Resources>
.......
      <!--使用就Style={StaticResource就可以了}-->
     <Border Style="{StaticResource ContentBorder}" />

样式字典

因为WPF的样式写起来很麻烦,控件一多,样式也多了起来。所以我们可以将样式独立放一个资源字典文件里面。

WPF 样式及资源字典的使用

添加资源字典



比如我要引入如下资源文件,我的路径就是

复制代码
Source="/BlankApp1;component/ViewStyles/LeftListStyle.xaml" 

全局样式

将x:Key去掉,就是全局样式了。

xml 复制代码
<Window.Resources>
    <!--设置样式 TargetType指向类型,x:Key去掉即全局样式-->
    <Style TargetType="Border">
        <Setter Property="BorderBrush"
                Value="Black" />
        <Setter Property="BorderThickness"
                Value="3" />
    </Style>
</Window.Resources>

但是这个是有一个问题的。我们设置的是全局样式,不能单独批量设置样式。

比如我有两个Grid。一个Gird全部都是Style1,一个Grid里面全是Style2。那我只能每个控件都绑定一个Style,很不合理。而且WPF没有CSS的样式选择器,WPF的样式也只能单继承。

局部全局样式

经过我的长期研究,研究了两天,终于研究出WPF的局部全局样式了,其实就是设置容器的Resource,在里面设置全局样式

xml 复制代码
<Grid>
    <Grid.Resources>
        <Style TargetType="Border">
        	<!--里面是你的样式-->
        </Style>
    </Grid.Resources>
</Grid>

但是有一个问题,无法穿透样式,比如我就无法穿透到Button的Resource里面

xml 复制代码
<Grid>
    <Grid.Resources>
        <Style TargetType="Border">
        	<!--里面是你的样式-->
        </Style>
    </Grid.Resources>
    <!--这个有效-->
    <Border/>
    <Button>
    	<!--这个就无效-->
   		<Border/>
    </Button>
</Grid>

全局样式穿透

解决方案就是设置Style的Resource。

stackOverflow Button Resources defined in Style

xml 复制代码
<Grid>
    <Grid.Resources>
        <Style TargetType="Button">
        	<Style.Resources>
        		<Style TargetType="Border">
        			<!--里面是你的样式-->
        		</Style>
        	</Style.Resources>
        	
        </Style>
    </Grid.Resources>
    <Button>
    	<!--这个就能成功穿透-->
   		<Border/>
    </Button>
</Grid>
相关推荐
FuckPatience13 小时前
WPF DataGrid 行根据某个属性循环变色动画
wpf
一条闲鱼_mytube3 天前
高并发短链接系统设计
wpf
一个天蝎座 白勺 程序猿4 天前
IoTDB集群扩容:从慌乱到从容的经验分享
数据库·wpf·时序数据库·iotdb
samble4 天前
从零搭建灌装监控系统(十三):报警系统设计,生命周期与通知
c#·wpf·mvvm·modbus·工业控制
samble5 天前
从零搭建灌装监控系统(十二):配置系统,原子写入与容错
c#·wpf·mvvm·modbus·工业控制
蜗牛互联网8 天前
OLMo-core 3的token gerrymandering提醒:MoE路由要按时间窗验收
java·人工智能·wpf
LateFrames8 天前
WPF 升级选型:用 .NET 8 还是 .NET 10
.net·wpf·.net8·.net10
samble8 天前
从零搭建灌装监控系统(十):生产追溯,条码触发自动记录
c#·wpf·mvvm·modbus·工业控制
SamChan9010 天前
PDF页面旋转与CropBox陷阱:译文回填位置总是错位的根因实测
python·ai·pdf·wpf
SamChan9011 天前
PDF翻译时页眉页脚总在捣乱?跨页重复文本块的检测与过滤实测
人工智能·python·ai·pdf·wpf