当前位置: 首页 > news >正文

WPF仿网易云搭建笔记(1):项目搭建

文章目录

  • 前言
  • 项目地址
  • 动态样式
  • 组合样式
  • 批量样式覆盖
  • Prism新建UserControler
  • 修改Material Design 笔刷
  • 收放列表
    • 可以滚动的StackPanel
    • 列表
    • 点击展开或折叠
  • 实现效果

前言

今天接着继续细化代码,把整体框架写出来

项目地址

WPF仿网易云 Gitee仓库

动态样式

【WPF】C#代码动态改变控件的样式

声明个Style变量

public class IconButton
{public string Name { get; set; }public string Icon { get; set; }public RelayCommand RelayCommand { get; set; }public Style Style { get; set; }
}

引入资源字典,通过Key查找样式

public ResourceDictionary StyleResource { get; set; }public TitileViewModel() {StyleResource = new ResourceDictionary(){//Uri路径是"/项目;componet/文件路径"Source = new Uri("/BlankApp1;component/ViewStyles/TitleStyle.xaml",UriKind.RelativeOrAbsolute)};IconButton = new IconButton(){Name = "EmailBox",Icon = "EmailBox",RelayCommand = new RelayCommand(() =>{Debug.WriteLine("按钮测试");}),Style = (Style)StyleResource["SelectIcon"]};
}

组合样式

但是我发现我用不了,这个好像不好用

[WPF]控件应用多个样式

批量样式覆盖

由于WPF的Style没有Css 的类选择器,而且WPF 不允许同时设置多个样式,所以WPF的样式写起来很啰嗦

批量样式设置可以设置某个控件的Resource,在里面添加Style

<Grid Background="#FF6666"><Grid.Resources><!--你的样式覆盖,这个会对所有的Grid里面的控件生效--><Style TargetType="TextBlock"BasedOn="{StaticResource TitleText}"></Style></Grid.Resources>
</Grid>

但是对于Materail Design 控件无效,需要特殊方法覆盖样式。但是根据我的测试,无法覆盖,只能硬写。要么就用数据模板批量赋值。我折腾了两天,想想还是放弃了,WPF 的Style 的缺陷没办法避免,写起来就是麻烦。

根据实际测试,只能覆盖原生的控件,不能覆盖Material Design的控件样式。

Overriding Material Design Styles

Prism新建UserControler

在这里插入图片描述

修改Material Design 笔刷

C# WPF Material Design MaterialDesignFlatButton Hint\HighLight Color

使用的Key覆盖的方法,将Material Design 的笔刷的Key覆盖。这也说明了为什么Material Design不能直接全局覆盖

在这里插入图片描述

在这里插入图片描述
为什么这么设置,就可能需要看源码了。这里面的Style依赖太过于复杂,我暂时就不去琢磨了。

根据我的测试,修改SolidColorBrush就可以了。

收放列表

在这里插入图片描述
这个分为两部分,按钮事件和列表展开收缩。

可以滚动的StackPanel

<!--在外侧添加一个ScrollViewer,我这里使用了VerticalScrollBarVisibility来隐藏滚动条-->
<ScrollViewer VerticalScrollBarVisibility="Hidden">
</ScrollViewer>

列表

新建一个List<`String>存放歌单

public List<string> MusicItems { get; set; }
.......MusicItems = new List<string>() {"五月天","夜曲","Deep Dark","Link Park","JoJo"
};

使用数据模板绑定数据源

<!--指定数据源-->
<ItemsControl ItemsSource="{Binding MusicItems}" Visibility="{Binding Visibility}"><!--数据容器选择StackPanel--><ItemsControl.ItemsPanel><ItemsPanelTemplate><StackPanel /></ItemsPanelTemplate></ItemsControl.ItemsPanel><ItemsControl.ItemTemplate><DataTemplate><Button><StackPanel Orientation="Horizontal"><MD:PackIcon Kind="MusicNoteSixteenth"Width="12"Height="12"VerticalAlignment="Center" /><!--如果是基本元素列表,直接Binding就好了--><TextBlock Text="{Binding}"FontSize="12"Margin=" 10 0 0 0" /></StackPanel></Button></DataTemplate></ItemsControl.ItemTemplate>
</ItemsControl>

点击展开或折叠

我这里没做动画,动画太难了,先实现基本逻辑

public partial class  LeftListViewModel : ObservableObject
{public List<string> MusicItems { get; set; }/// <summary>/// 歌单列表展开或者关闭/// </summary>public RelayCommand MusicItemsOpenOrClose { get; set; }/// <summary>/// 通过是否可见来设置列表/// </summary>[ObservableProperty]private Visibility visibility;public LeftListViewModel(){Visibility = Visibility.Hidden;MusicItems = new List<string>() {"五月天","夜曲","Deep Dark","Link Park","JoJo"};MusicItemsOpenOrClose = new RelayCommand(() => {if(Visibility == Visibility.Visible){Visibility = Visibility.Hidden;}else{Visibility = Visibility.Visible;}});}
}

然后在按钮上面添加点击事件

<Button Command="{Binding MusicItemsOpenOrClose}"><StackPanel Orientation="Horizontal"><MD:PackIcon Kind="FormatListBulleted"VerticalAlignment="Center" /><TextBlock Text="歌曲列表"Margin=" 10 0 0 0" /></StackPanel>
</Button>

完整代码可以看我的Gitee仓库

WPF仿网易云 Gitee仓库

实现效果

在这里插入图片描述

相关文章:

  • Navicat 技术指引 | 适用于 GaussDB 分布式的调试器
  • Fabric 画布缩放、拖动、初始化大小
  • kubernetes的服务发现(二)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • 【S32DS报错】-3-提示J-Link GDB Server failed:Device name ‘S32K344‘ not recognised错误
  • 【CSP】202303-2_垦田计划Python实现
  • 图论——最小生成树
  • 黑马头条数据管理平台项目总结
  • Gateway:微服务架构中的关键组件
  • IntelliJ idea卡顿解决,我遇到的比较管用的方案
  • MindOpt APL:一款适合优化问题数学建模的编程语言
  • 集简云 x 零售企业丨快速集成有赞商城和微盛企微管家,实现私域运营自动化
  • Vue2学习(组件的使用)
  • 如何选择合适的运筹优化求解器?
  • JPA对数据库修改注意点
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Debian下无root权限使用Python访问Oracle
  • git 常用命令
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JAVA_NIO系列——Channel和Buffer详解
  • javascript从右向左截取指定位数字符的3种方法
  • markdown编辑器简评
  • mockjs让前端开发独立于后端
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • 从零开始的无人驾驶 1
  • 大型网站性能监测、分析与优化常见问题QA
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 对超线程几个不同角度的解释
  • 目录与文件属性:编写ls
  • 区块链共识机制优缺点对比都是什么
  • 学习Vue.js的五个小例子
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #git 撤消对文件的更改
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (NSDate) 时间 (time )比较
  • (二)WCF的Binding模型
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (离散数学)逻辑连接词
  • (转载)(官方)UE4--图像编程----着色器开发
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .Net mvc总结
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET开发不可不知、不可不用的辅助类(一)
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @JsonSerialize注解的使用
  • @ModelAttribute使用详解