WPF框架学习

打印 上一主题 下一主题

主题 887|帖子 887|积分 2661

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>
    <命名空间ersonViewModle/>
</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>rism 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 换成prismrismApplication
  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<rism9.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("arameter", 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<rism9.View.MainView>();  是有多个的 





免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

石小疯

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表