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多)

  1. 改成Prism 框架,app的xaml 、 cs文件 改成继承 PrismApplication 和实现接口
  1. 继承PrismApplication 和引用命名空间

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

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

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

启动后正常。

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

  2. 框架模板的使用

(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>(); 是有多个的

相关推荐
Aphelios3806 小时前
Linux 下 VIM 编辑器学习记录:从基础到进阶(下)
java·linux·学习·编辑器·vim
Best_Me076 小时前
【CVPR2024-工业异常检测】PromptAD:与只有正常样本的少样本异常检测的学习提示
人工智能·学习·算法·计算机视觉
日记成书6 小时前
详细介绍STM32(32位单片机)外设应用
stm32·学习
li星野6 小时前
std::thread的同步机制
开发语言·c++·学习
技术小齐7 小时前
网络运维学习笔记 021 HCIA-Datacom新增知识点02 SDN与NFV概述
运维·网络·学习
im长街8 小时前
Ubuntu22.04 - brpc的安装和使用
学习
知识分享小能手8 小时前
Html5学习教程,从入门到精通,HTML5 简介语法知识点及案例代码(1)
开发语言·前端·javascript·学习·前端框架·html·html5
你可以叫我仔哥呀9 小时前
k8s学习记录:环境搭建(基于Kubeadmin)
学习·容器·kubernetes
试试看16810 小时前
自制操作系统前置知识汇编学习
汇编·学习