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

news2024/12/29 10:16:10

文章目录

  • 前言
  • 项目地址
  • 动态样式
  • 组合样式
  • 批量样式覆盖
  • 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仓库

实现效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1313037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux 查看服务启动时间

文章目录 linux 查看服务启动时间参数解析 linux 查看服务启动时间 [root104 ~]# ps -o lstart -p ps -ef |grep -v grep |grep "zookeeper"|awk {print$2}STARTED Fri Dec 15 16:54:10 2023参数解析 linux 命令中 ps -ef 详解 ps -ef表示查看全格式的进程。 ps …

视频号小店需要缴纳保证金吗?保证金缴纳标准,不懂的快来看!

我是电商珠珠 入驻视频号小店&#xff0c;需要缴纳保证金吗&#xff1f;具体缴纳多少&#xff1f;... 这是想要入驻视频号小店的热门话题&#xff0c;今天我就来给大家一一讲明白。 想要入驻视频号小店&#xff0c;就必须要缴纳保证金。保证金是平台为了约束商家的行为&…

LLM之Agent(六)| 使用AutoGen、LangChian、RAG以及函数调用构建超级对话系统

本文我们将尝试AutoGen集成函数调用功能。函数调用最早出现在Open AI API中&#xff0c;它允许用户调用外部API来增强系统的整体功能和效率。例如&#xff0c;在对话过程中根据需要调用天气API。 函数调用和Agent有各种组合&#xff0c;在这里我们将通过函数调用调用RAG检索增强…

Windows 7如何将分区标记为活动分区?

引导分区&#xff0c;也称为引导卷&#xff0c;是包含引导加载程序和Windows操作系统所需文件的磁盘分区&#xff0c;是正常启动计算机的前提。一个正确的引导分区不只要包含相关的可引导数据&#xff0c;还需要将分区标记为活动分区。那么&#xff0c;如何将Windows 7分区标记…

网络安全——基于Snort的入侵检测实验

一、实验目的要求&#xff1a; 二、实验设备与环境&#xff1a; 三、实验原理&#xff1a; 四、实验步骤&#xff1a; 五、实验现象、结果记录及整理&#xff1a; 六、分析讨论与思考题解答&#xff1a; 七、实验截图&#xff1a; 一、实验目的要求&#xff1a; 1、掌握…

SuperMap iPortal权限介绍

作者&#xff1a;yx 文章目录 前言一、内置权限二、自定义权限&#xff08;11.1.0及以后版本&#xff09;1、修改配置文件2、页面展示3、api调用4、结果验证5、实际应用 前言 iPortal 用户访问和使用门户中资源的能力取决于其用户类型与在门户中拥有的权限&#xff0c;权限通过…

深入分析ClassLocader工作机制

文章目录 一、ClassLoader简介1. 概念2. ClassLoader类结构分析 二、ClassLoader的双亲委派机制三、Class文件的加载流程1. 简介2. 加载字节码到内存3. 验证与解析4. 初始化Class对象 四、常见加载类错误分析1. ClassNotFoundException2. NoClassDefFoundError3. UnsatisfiledL…

2023.12.13 关于 MySQL 复杂查询

目录 聚合查询 聚合函数 group by 子句 执行流程图 联合查询 笛卡尔积 内连接 外连接 左外连接 右外连接 自连接 子查询 单行子查询 多行子查询 EXISTS 关键字 合并查询 union on 和 union 的区别 聚合查询 聚合函数 函数说明COUNT([DISTINCT] expr)返回查询到…

wpf TelerikUI使用DragDropManager

首先&#xff0c;我先创建事务对象ApplicationInfo&#xff0c;当暴露出一对属性当例子集合对于构成ListBoxes。这个类在例子中显示如下代码&#xff1a; public class ApplicationInfo { public Double Price { get; set; } public String IconPath { get; set; } public …

【【ZYNQ 7020显示 图片 实验 】】

ZYNQ 7020显示 图片 实验 关键配置 BRAM 因为本次 我想显示的 图片是 400*400 所以在 内部 的 ROM 存储单元选择 了160000 ZYNQ7020的内部资源 最多是 大概 200000左右的 大小 大家可以根据 资源选择合适的像素 此处存放 内部的 图片转文字的COE文件 PLL设置 我选用的是按…

详解wmvcore.dll丢失的解决方法

wmvcore.dll是一款由Microsoft开发的Windows系统文件&#xff0c;主要用于存储和处理多媒体文件&#xff0c;尤其是Windows媒体视频。该文件对于音频和视频的播放至关重要。如果电脑上缺少这个文件&#xff0c;可能会出现播放问题或者相关的应用程序运行错误。在本文中&#xf…

Netty详解

目录标题 1、前期知识科普1.1 NIO 基本概念1.2 java BIO与NIO对比1.3 Reactor 模型 2、Netty 基础概念2.1 Netty 简介2.2 Netty 执行流程2.3 Netty 核心组件 3、Netty Demo编写3.1 总体框架3.2 具体代码 4、交流群 1、前期知识科普 1.1 NIO 基本概念 阻塞&#xff08;Block&a…

0x21 树与图的遍历

0x21 树与图的遍历 树与图最常见的储存方式就是使用一个邻接表保存它们的边集。邻接表以head数组为表头&#xff0c;使用ver和edge数组分别存储边的终点和权值&#xff0c;使用next数组模拟链表指针&#xff08;就像我们在0x13节中讲解邻接表所给出的代码那样&#xff09;。 …

科技铸就企业转型钢筋铁骨,群硕获评2023年度数字化影响力企业

12月15日&#xff0c;STIF2023第四届国际科创节暨DSC2023国际数字服务大会在北京顺利举行&#xff0c;本次大会以“数实融合 推动高质量发展”为主题&#xff0c;各大科技服务企业齐聚一堂&#xff0c;共同探讨2023科技发展新趋势。 大会上&#xff0c;群硕软件继2022年后再度…

Java版商城:Spring Cloud+SpringBoot b2b2c实现多商家入驻、直播带货及免 费小程序商城搭建

1. 涉及平台 平台管理、商家端&#xff08;pc端、手机端&#xff09;、买家平台&#xff08;h5/公众号、小程序、app端&#xff08;ios/android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 spring cloud、spring boot、mybatis、redis 3. 前端框架…

如何远程访问Axure RP制作的本地web站点实现协同办公

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

浅析AI视频分析与视频管理系统EasyCVR平台及场景应用

人工智能的战略重要性导致对视频智能分析的需求不断增加。鉴于人工智能视觉技术的巨大潜力&#xff0c;人们的注意力正在从传统的视频监控转移到计算机视觉的监控过程自动化。 1、什么是视频分析&#xff1f; 视频分析或视频识别技术&#xff0c;是指从视频片段中提取有用信息…

java.lang.UnsupportedOperationException

一、背景 记录一次小坑… 最近在写一个关于Excel导出的小需求&#xff0c;由于系统都有一些工具类&#xff0c;还有原来已经做好的导出&#xff0c;直接拿过来改了改就用了&#xff0c;没想到直接报错&#xff0c;尴尬。 还是那句话&#xff0c;别人都能用&#xff0c;我复制…

innovus:ccopt_design流程

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 ccopt完整的流程包括如下几个步骤&#xff1a; spec文件可以只创建一次&#xff0c;无需多次创建。 1&#xff09;clustering阶段 set_ccopt_property balance_mode cluster …

产品经理之Axure的元件库使用详细案例

⭐⭐ 产品经理专栏&#xff1a;产品专栏 ⭐⭐ 个人主页&#xff1a;个人主页 ​ 目录 前言 一.Axure的元件库的使用 1.1 元件介绍 1.2 基本元件的使用 1.2.1 矩形、按钮、标题的使用 1.2.2 图片及热区的使用 1.3 表单元件及表格元件的使用 1.3.1表单元件的使用 1.3.…