WPF框架学习

WPF 可以想winfrom 那样在cs文件修改 属性数据;

为了前后端分离 而解耦合,有了M-V-VM模式

常见框架有 MVVMlight / Prism 等

-------------------------------------------------------------------------------------

一、前提:有一定基础,学会数据绑定

1.数据绑定

关键字 Binding

绑定源(ViewModel)绑定源中要使用的值的路径(VM的某个属性)

绑定目标对象   绑定目标对象的属性 

绑定目标对象的属性   为依赖属性。

绑定源 不限于自定义的.net对象。

DataContext

总结:Model在ViewModel中,ViewModel在View的DataContext中,View引用Model(通过绑定)。

建立ViewModel类

新建一个类,继承实现INotifyPropertyChanged接口

INotifyPropertyChanged接口是 WPF 和其他支持数据绑定的 UI 框架中常用的一个接口,用于通知客户端(如 UI 控件)属性值已更改。

命名空间:

using System.ComponentModel;
using System.Runtime.CompilerServices;

实现接口+定义通知函数:

固定代码片段(可以把重复固定的代码做一个VM基类,让其它具体的VM类继承扩展)

用于改变时 VM类对象 通知 View类对象;或者反之;

[CallerMemberName]特性谁改变传参谁。

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)

{

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

}

切换到view

指定上下文DataContext

可以写到cs文件

任意控件的DataContent 属性=new vm类

例如:

this.DataContent=new PersonViewModle();

也可以写到XAML, 也是任意控件,影响控件范围和样式一样,例如:

<Window.DataContext>
    <命名空间:PersonViewModle/>
</Window.DataContext>

加控件绑定这个ViewModle,比如可以改文本的控件

<TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"  FontSize="16"/>

或者

<TextBox Text="{Binding Name}"  FontSize="16"/>

后者不会发出事件,正常是使用前者,按需使用

运行程序,改变

--------------------------------------------------

绑定源未精通,参考78. MVVM - Binding RelativeSource四种模式_哔哩哔哩_bilibili

关键字 绑定Binding和模板绑定TemplateBinding

依赖属性={Binding RelativeSource={RelativeSource Mode=TemplatedParent},。。。可以简写成

依赖属性={TemplateBinding Property= Content}。。。

绑定的相关设置:

(1)绑定模式(2)绑定 转换器 ,多值转换器(3) 值的数据校验(4)命令command

命令command

把事件转化成一个个命令

命令目标,未设置时,谁有焦点(点了谁),谁就是目标

-------------------------------------------------------------------------------

多少个页面就有多少个VM ?怎么理解?

++++++++++++++++++++++++++++

另开一篇01-Prism框架中数据与命令基本使用_哔哩哔哩_bilibili

Prism 框架

 1.安装 Prism.core  和wpf

2.新建主界面的viewModel类 继承Prism.Mvvm.BindableBase

(1)看看继承的父类 实现通知接口外,还有 RaisePropertyChanged() 提醒场景变更?

        +返回bool 的SetProperty<T>()两个(参数不同,方法重载)来设置属性

(2)快捷片段 porpfull ,也可以自定义代码片段,把set 方法内容改成SetProperty<T>(ref _xxx,xxx)

(3)xaml 或代码指定 DataContext 

3.在当前VM类 定义命令 DeleaateCommand / DelegateCommand<T>

(1)自定义代码片段 mycmd

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>mycmd</Title>
            <Shortcut>mycmd</Shortcut>
            <Description>Prism VM类的 命令自定义 的代码片段</Description>
            <Author>Microsoft Corporation</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
          <Code Language="C#">
            <![CDATA[
            //命令属性定义
            public DelegateCommand XxxCommand { get; set; }
            public MainViewModel()
            {
                XxxCommand = new DelegateCommand(
                        ()=>{ }
                    );
            }
            ]]>
          </Code>
        </Snippet>        
    </CodeSnippet>
</CodeSnippets>

+++++++++++++++++++++++++++++++++

另开一篇

3.创建Prism应用程序_哔哩哔哩_bilibili

1.安装 Prism.DryIoc(8.0版本比Prism.unity版本好) 会自动安装Prism.wpf

细节参考:wpf使用prism框架Dryioc容器实现导航 wpf prism教程_mob6454cc73e9a6的技术博客_51CTO博客

(问题:我当前只有9.0版本,无法在.net frameword4.6.2安装(教程是vs2019.net core),卡半天还失败了,没翻墙,Uinty可以安装。

填坑:最后我连上对应网络后,.net frameword 和.net9.0都可以了,而且提示比Uinty多)

2. 改成Prism 框架,app的xaml 、 cs文件 改成继承 PrismApplication 和实现接口

1. 继承PrismApplication 和引用命名空间

2. xmlns:prism="http://prismlibrary.com/"  上面引用后才可以在xaml文件有这个提示

3. app.xaml 控件 Application 换成prism:PrismApplication

4. cs文件实现接口.9.0以上版本,不需要,先重新生成

启动后正常。

3. 看代码PrismApplication类,是继承Application类,重新了初始化等函数和封装

4. 框架模板的使用

(1)扩展(X)管理扩展(M),出现和vs code类似的扩展,查找Prism ,安装Prism Template Pack(一直在安装中的话,要进入浏览器下载exe安装,我下载的2个扩展都是这样)

(2)安装完毕,新建项目时 可以选择新的模板,和本地模板差不多,选WPF空模板,建立好之后和上面自行修改的一样

5.Region 区域

问题:.net framework4.6.2等版本无法正常启动,尝试 重装,清理生成都不行,.net 6.0可以

解决: 尝试把首选32位去掉,之后正常了,可能包含不能再32位运行的代码或程序

继续

可以在xaml  或 VM类文件 注册区域

xaml

<ContentControl x:Name="ctr" prism:RegionManager.RegionName="ContentRegion" ></ContentControl>

public partial class MainWindow : Window
{

    private readonly IRegionManager regionManager;
    public MainWindow()
    {
        InitializeComponent();
    }
    public MainWindow(IRegionManager p_regionManager)
    {
        InitializeComponent();
        this.regionManager = p_regionManager;
        RegionManager.SetRegionName(ctr, "ContentRegion");

    }

    
}

坑:教程不是.net framework,也不是vs工具,可以省略而不报错,我的要补回去,不能在原来的加参数

上面又遇到问题,显示不出动态内容ViewA.xaml

填坑上面异常:

单单在xaml写上

<Window.DataContext>
        <vm:MainViewModel></vm:MainViewModel>
    </Window.DataContext> 是不行的,应该还要设置其它不了解的,反复检查一天多无果,

决定按教材里的结构来,

(1)xaml 加上主prism:ViewModelLocator.AutoWireViewModel="True"

(2)然后文件夹加s结尾,分别是Views  和 ViewModels

(3) MainViewModel.cs 也变成 MainViewModels.cs

(4) 无参的构造函数+有参的一起保留  或 像教材改成有参 都可行

(5)注册区域导航的函数内 再加上

containerRegistry.RegisterForNavigation<Prism9.View.MainView, ViewModel.MainViewModels>();   

和教材不一致的这句加上,是另一个视频教材评论区说要加上的,经测现在的9.0版本要加上

(6)MainViewModel.cs 和 MainViewModels.cs 都可以,但是都要加上第五步

6.模块化Module 实现了IModule接口

没看懂,随后看

7. 区域导航

上面区域学习基础上,

切换任意以注册的View:

regionManager.RequestNavigate("ContentRegion", p_viewName); //区域"ContentRegion"显示以注册的区域p_viewName

导航切换过程中 传参:

例如 ViewA 对应的 ViewAViewModel.cs 继承ViewModel的基类BindableBase

                                                                再继承IConfirmNavigationRequest

方式一:

var paran = new NavigationParameters();

param.Add("Parameter", param);_regionManger.RequestNavigate("RegionName", "ViewlName",param);

方式二:类似URL地址传递参数

_regionManger.RequestNavigate("RegionName", $"ViewlName?Name=xiaoming");

导航前进后退:

MainViewModel.cs 加上

public IRegionNavigationJournal journal;

private void GoForword()
{
    journal.GoForward();
}
private void GoBack()
{
    journal.GoBack();
}

8.对话服务Dialog

什么是Dialog?对话框实际上是我们应用程序经常用到的一个功能类如:Show、ShowDialog。可以弹出一个我们指定的窗口,仅此而已 

messageViewModel.cs  继承BindableBase,

==============

上面没课件资料,视频不细看,重开别的教材

15.Prism区域介绍(2)_哔哩哔哩_bilibili

1. 动态资源和静态资源

区别:静态的给了一次之后就固定了,动态的还可以有二次改变,静态的二次设置不会变

==============================

另一个

03-Prism框架中的事件总线-消息_哔哩哔哩_bilibili

1.事件总线/事件聚合器(IEventAggregator)

(1)消息

public MainView(IEventAggregator xxx){ }

直接运行报错,要Prism框架的IOC传参进来,

注释的和没注释的选其一都有参数传入

而return Container.Resolve<Prism9.View.MainView>();  是有多个的 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络运维学习笔记 017 HCIA-Datacom综合实验01

文章目录 综合实验1实验需求总部特性 分支8分支9 配置一、 基本配置&#xff08;IP二层VLAN链路聚合&#xff09;ACC_SWSW-S1SW-S2SW-Ser1SW-CoreSW8SW9DHCPISPGW 二、 单臂路由GW 三、 vlanifSW8SW9 四、 OSPFSW8SW9GW 五、 DHCPDHCPGW 六、 NAT缺省路由GW 七、 HTTPGW 综合实…

git,bash - 从一个远端git库只下载一个文件的方法

文章目录 git,bash - 从一个远端git库只下载一个文件的方法概述笔记写一个bash脚本来自动下载get_github_raw_file_from_url.shreanme_file.shfind_key_value.sh执行命令 END git,bash - 从一个远端git库只下载一个文件的方法 概述 github上有很多大佬上传了电子书库&#xf…

【废物研究生零基础刷算法】DFS与递归(一)典型题型

文章目录 跳台阶递归实现指数级枚举递归实现排列型枚举上面两题总结 递归实现组合型枚举P1036选数 跳台阶 思路&#xff1a; 如果 n 1&#xff0c;只有一种走法&#xff08;走 1 级&#xff09;。如果 n 2&#xff0c;有两种走法&#xff08;11 或 2&#xff09;。对于 n &g…

Java-01-源码篇-04集合-05-ConcurrentHashMap(1)

1.1 加载因子 加载因子&#xff08;Load Factor&#xff09;是用来决定什么时候需要扩容的一个参数。具体来说&#xff0c;加载因子 当前元素数量 / 桶的数量&#xff0c;当某个桶的元素个数超过了 桶的数量 加载因子 时&#xff0c;就会触发扩容。 我们都知道 ConcurrentHas…

AI赋能的未来城市:如何用智能化提升生活质量?

这会是我们憧憬的未来城市吗&#xff1f; 随着技术的不断进步和城市化进程的加速&#xff0c;现代城市面临着诸多挑战——交通拥堵、环境污染、能源消耗、人口老龄化等问题愈发突出。为了应对这些挑战&#xff0c;建设智慧城市已成为全球发展的重要趋势。在这一进程中&#xf…

DeepSeek各模型现有版本对比分析

文章目录 一、基础模型系列&#xff1a;V1 到 V3 的演进二、专用模型系列&#xff1a;推理与多模态三、版本选型与商业化趋势 DeepSeek作为最近特别火爆的模型&#xff0c;本文将对DeepSeek现有的主要版本进行对比分析,涵盖参数规模、训练数据、功能改进、应用场景和性能表现等…

【亲测有效】百度Ueditor富文本编辑器添加插入视频、视频不显示、和插入视频后二次编辑视频标签不显示,显示成img标签,二次保存视频被替换问题,解决方案

【亲测有效】项目使用百度Ueditor富文本编辑器上传视频相关操作问题 1.百度Ueditor富文本编辑器添加插入视频、视频不显示 2.百度Ueditor富文本编辑器插入视频后二次编辑视频标签不显示&#xff0c;在编辑器内显示成img标签&#xff0c;二次保存视频被替换问题 问题1&#xff1…

hot100_108. 将有序数组转换为二叉搜索树

hot100_108. 将有序数组转换为二叉搜索树 思路 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#…

RFID涉密载体柜:智能安全,全程守护,提供智能化的安全管控

行业背景 RFID智能载体柜&#xff08;DW-G101&#xff09;是一种便捷化的载体管控系统&#xff0c;它采用RFID技术实现信息化&#xff0c;可以大大提高载体管理的效率和准确性。 随着信息化的快速发展&#xff0c;涉密载体&#xff08;如文件、U盘、光盘等&#xff09;的管理…

【复习】计算机网络

网络模型 OSI 应用层&#xff1a;给应用程序提供统一的接口表示层&#xff1a;把数据转换成兼容另一个系统能识别的格式会话层&#xff1a;负责建立、管理、终止表示层实体之间的通信会话传输层&#xff1a;负责端到端的数据传输网络层&#xff1a;负责数据的路由、转发、分片…

多线程篇学习面试

多线程 1.乐观锁、CAS思想 java乐观锁机制&#xff1a; ​ 乐观锁体现的是悲观锁的反面。它是一种积极的思想&#xff0c;它总是认为数据是不会被修改的&#xff0c;所以是不会对数据上锁的。但是乐观锁在更新的时候会去判断数据是否被更新过。乐观锁的实现方案一般有两种&a…

Spring Boot 概要(官网文档解读)

Spring Boot 概述 Spring Boot 是一个高效构建 Spring 生产级应用的脚手架工具&#xff0c;它简化了基于 Spring 框架的开发过程。 Spring Boot 也是一个“构件组装门户”&#xff0c;何为构件组装门户呢&#xff1f;所谓的“构件组装门户”指的是一个对外提供的Web平台&#x…

计算机毕业设计SpringBoot+Vue.jst0甘肃非物质文化网站(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

匹配算法:向下就近原则,向下没有就向上

匹配算法&#xff1a;向下就近原则&#xff0c;向下没有就向上 实现方式一实现方式二总结 实现方式一 private static List<Integer> findMatches(List<Integer> sourceList, List<Integer> searchValues) {List<Integer> sortedList sourceList.stre…

ESP32S3:解决RWDT无法触发中断问题,二次开发者怎么才能使用内部RTC看门狗中断RWDT呢?

目录 基于ESP32S3:解决RWDT无法触发中断问题引言解决方案1. 查看报错日志2. 分析报错及一步一步找到解决方法3.小结我的源码基于ESP32S3:解决RWDT无法触发中断问题 引言 在嵌入式系统中,RWDT(看门狗定时器)是确保系统稳定性的重要组件。然而,在某些情况下,RWDT可能无法…

【GPU驱动】OpenGLES图形管线渲染机制

OpenGLES图形管线渲染机制 OpenGL/ES 的渲染管线也是一个典型的图形流水线&#xff08;Graphics Pipeline&#xff09;&#xff0c;包括多个阶段&#xff0c;每个阶段都负责对图形数据进行处理。管线的核心目标是将图形数据转换为最终的图像&#xff0c;这些图像可以显示在屏幕…

PHP post 数据丢失问题

max_input_vars是PHP配置选项之一&#xff0c;用于设置一个请求中允许的最大输入变量数。它指定了在处理POST请求或者通过URL传递的参数时&#xff0c;PHP脚本能够接收和处理的最大变量数量。 max_input_vars的默认值是1000&#xff0c;意味着一个请求中最多可以包含1000个输入…

Mac下Python版本管理,适用于pyenv不起作用的情况

前言 声明&#xff1a;之前也在网上看到过可以使用pyenv来管理python版本&#xff0c;但由于作者的python安装路径实在是繁杂不堪&#xff0c;因此安装完成pyenv体验下来没有任何用处&#xff0c;但偶然发现vscode似乎可以看到各个python版本&#xff0c;因此写下这篇博客记录…

什么是完全前向保密(PFS)?

在当今数字化时代&#xff0c;信息安全至关重要。而密码学中的完全前向保密&#xff08;Perfect Forward Secrecy&#xff0c;简称PFS&#xff09;技术&#xff0c;已经成为保障信息安全的关键一环。如果没有完全前向保密&#xff0c;一旦长期密钥被泄露&#xff0c;攻击者就可…

计算机毕业设计SpringBoot+Vue.jst在线文档管理系统(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…