WPF 学习总结归纳之发布订阅与代理模式以及命令的投石问路(一)

 2023-09-05 阅读 61 评论 0

摘要:1.X:Name与Name的区别 一些WPF框架级别的应用程序可能能够避免使用x:Name属性,因为WPF命名空间中为几个重要基类(例如FrameworkElement / FrameworkContentElement)指定的Name依赖项属性满足了相同的目的。 仍然存在一些常见的XAML和框架方

1.X:Name与Name的区别
一些WPF框架级别的应用程序可能能够避免使用x:Name属性,因为WPF命名空间中为几个重要基类(例如FrameworkElement / FrameworkContentElement)指定的Name依赖项属性满足了相同的目的。 仍然存在一些常见的XAML和框架方案,其中需要对不具有Name属性的元素进行代码访问,尤其是在某些动画和情节提要支持类中。 例如,如果要从代码中引用x:Name,则应在XAML中创建的时间轴和转换上指定它们。
如果Name可以作为类的属性使用,则Name和x:Name可以作为属性互换使用,但是如果在同一个元素上同时指定二者,则会导致错误。
更通俗的解释就是:
x:Name和Name引用不同的名称空间
x:name是对Xaml文件顶部默认定义的x名称空间的引用。
xmlns:x=“http://schemas.microsoft.com/winfx/2006/xaml”
只是说Name使用下面的默认名称空间。
xmlns=“http://schemas.microsoft.com/winfx/2006/xaml/presentation”
x:Name表示使用具有x别名的名称空间。 x是默认值,大多数人都保留它,但是您可以将其更改为任意值
xmlns:foo=“http://schemas.microsoft.com/winfx/2006/xaml”
所以您的参考将是foo:name
也可以自行设置,其实是一种语言规范。
2.命令机制:
在学习WPF时候是离不开命令的,那么命令是如何作用的,这个原理是必须要搞清楚的。
CanExected:是首先进行无限检测,是否触发了该命令,触发了则进行执行,说白了就是投石问路
Exected:对应的执行事件,执行的具体方法是Event
Event:具体命令的执行行为。
3.委托模型;
因为上面谈到了事件,那么事件的本质是委托模型,所以必须知道委托模型的原理:WPF中的命令机制使用的是发布订阅机制,关于该机制,可以参照下面代码悉知;
首先发布者定义一系列事件,并提供一个注册方法;
订阅者向发布者注册自己的事件处理逻辑,供一个可被回调的方法,也就是事件处理程序;当发布者的事件被触发的时候,订阅者将通过回调函数得到发布者通知,而订阅者所注册的回调函数,也就是事件处理逻辑的所有方法都会被执行

发布者是指拥有某事件的类或者结构
订阅者是指向发布者注册的类或者结构
事件处理程序是指由订阅者注册到事件的方法,在发布者触发事件时执行
参考:可详细学习https://blog.csdn.net/weixin_38486884/article/details/82853508

从一个简单的例子,来说明一下这种事件消息传递的机制!

有一家三口,妈妈负责做饭,爸爸和孩子负责吃。。。将这三个人,想象成三个类。

妈妈有一个方法,叫做“做饭”。有一个事件,叫做“开饭”。做完饭后,调用开饭事件,发布开饭消息。

  爸爸和孩子分别有一个方法,叫做“吃饭”。

将爸爸和孩子的“吃饭”方法,注册到妈妈的“开饭”事件。也就是,订阅妈妈的开饭消息。让妈妈做完饭开饭时,发布吃饭消息时,告诉爸爸和孩子一声。

这种机制就是C#中的,订阅发布。下面我们用代码实现:

复制代码
class Program
{
public static void Main(string[] args)
{
//实例化对象
Mom mom = new Mom();
Dad dad = new Dad();
Child child = new Child();

        //将爸爸和孩子的Eat方法注册到妈妈的Eat事件//订阅妈妈开饭的消息mom.Eat += dad.Eat;mom.Eat += child.Eat;//调用妈妈的Cook事件mom.Cook();Console.Write("Press any key to continue . . . ");Console.ReadKey(true);}
}public class Mom
{//定义Eat事件,用于发布吃饭消息public event Action Eat;public void Cook(){Console.WriteLine("妈妈 : 饭好了");//饭好了,发布吃饭消息Eat?.Invoke();}
}public class Dad
{public void Eat(){//爸爸去吃饭Console.WriteLine("爸爸 : 吃饭了。");}
}public class Child
{public void Eat(){//熊孩子LOL呢,打完再吃Console.WriteLine("孩子 : 打完这局再吃。");}
}

复制代码

运行结果:
在这里插入图片描述
4.代理模式的静态代理与动态代理:
此处是因为在项目中发现使用了代理模式,然后自己进行学习研究该模式到底该如何使用,怎么去使用,以及它的利弊。
什么是代理模式?
代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。
举个例子来说明:假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了。我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择自己喜欢的车,然后付钱就可以了。用图表示如下:
在这里插入图片描述

为什么要用代理模式?
中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后对返回结果的处理等。代理类本身并不真正实现服务,而是同过调用委托类的相关方法,来提供特定的服务。真正的业务功能还是由委托类来实现,但是可以在业务功能执行的前后加入一些公共的服务。例如我们想给项目加入缓存、日志这些功能,我们就可以使用代理类来完成,而没必要打开已经封装好的委托类。
代理模式一般有动态代理和静态代理,他们的利弊:
静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了。动态代理是在程序运行时通过反射机制动态创建的。
静态代理总结:
优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展。
缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。
动态代理,我的理解是在运行时动态地产生代理类,进而产生代理对象。比如房屋中介,它就是一个代理对象,能代理行驶房东(可以理解为Target)的权力,除此之外中介可以对房东的权力添加一些附加值,拦截房东的一些行为,如收取中介费。
  在设计模式中,有一种模式叫做代理模式,在GOF中这样写道:
  为其他对象提供一种代理以控制对这个对象的访问。
  动态代理用于比如权限检测,日志打印,事务处理等。
  关于动态代理,我现在还在研究中,剩下的就不多进行发言,可以学习该链接,进行详细学习,个人认为动态代理是至关重要的一种项目思维模式。
https://blog.csdn.net/weixin_39567973/article/details/104611436
5.WPF的双向绑定机制:
在我们进行绑定时,页面默认是双向绑定,但是根据自己项目的框架不同,会把一些属性设置为private,这样的话,对应的绑定是会受到影响的,因为有些数据是不可更改项,服务进行只提供显示,有些数据则是需要进行修改,那么此处就需要进行注意属性的权限。单向绑定的数据要进行oneway声明。
6.页面布局小结:
我们通常使用grid的自适应布局,但是在布局过程中,比如Row中,有三行,若对应的高度皆为*,第二行则无法进行撑开,要想其中一行自适应撑开,另外两行需要设置对应的高度。
本次总结完成,如有不对之处,请各位大佬进行指正。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/1043.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息