C# WPF MVVM项目实战(进阶②)

     这篇文章还是在之前用Caliburn.Micro搭建好的框架上继续做的开发,今天主要是增加了一个用户窗体ImageProcessView,然后通过Treeview切换选择项之后在界面显示不同效果的图片。

01

重要的知识点

本篇内容基于CM框架编写,涉及以下知识点:

①实现 INotifyPropertyChanged:在mvvm开发模式中,为了前台和后台更好的解耦合,前台界面一般通过绑定属性的方式获取属性值,而后台属性值变更后我们需要通知给前台视图,这时候我们的属性值就需要实现INotifyPropertyChanged这个接口。

由于StartViewModel继承了Caliburn.Micro.Screen,Caliburn.Micro.Screen实现了INotifyPropertyChanged,所以StartViewModel这个类本身是拥有属性变更通知界面的功能的。但是我们添加的窗体ImageProcessViewModel除了它的构造函数是在StartViewModel中实例化(拥有了INotifyPropertyChanged),其它想要实现这个接口有两种方式:

-. 继承Caliburn.Micro.Screen,即:

public class ImageProcessViewModel : Caliburn.Micro.Screen

-. 在nuget中引用PropertyChanged.Fody

并在类之前添加:

 [AddINotifyPropertyChangedInterface]

这样我们的这个类中所有的属性变更后就会主动通知界面更新了!

②TreeView用法实例:

主要包括TreeView树列表构建以及事件附件

 <TreeView Grid.Row="0" Grid.Column="0" Grid.RowSpan="1"><TreeViewItem Header="TreeView"><TreeViewItem Header="TranslateTransform"/><TreeViewItem Header="RotateTransform"/><TreeViewItem Header="ScaleTransform"/><TreeViewItem Header="SkewTransform"/><TreeViewItem Header="TransformGroup"/><TreeViewItem Header="MatrixTransform"/></TreeViewItem><TreeView.ItemContainerStyle><Style TargetType="{x:Type TreeViewItem}" ><Setter Property="cal:Message.Attach" Value="[Event Selected] = [Action item_SelectedItemChanged($source,$eventArgs)]"/>
</Style></TreeView.ItemContainerStyle></TreeView>

后台代码,重点是如何获取当前选择的Item:

 public void item_SelectedItemChanged(object sender, RoutedEventArgs e){TreeViewItem tvi = e.OriginalSource as TreeViewItem;var selectedItem = tvi.Header.ToString();switch (selectedItem){case "TranslateTransform":MessageBox.Show("这是一个图片平移效果"); Image1Show = Visibility.Visible; break;case "RotateTransform":MessageBox.Show("这是一个图片旋转效果"); Image2Show = Visibility.Visible; break;case "ScaleTransform":MessageBox.Show("这是一个图片缩放效果"); Image3Show = Visibility.Visible; break;case "SkewTransform":MessageBox.Show("这是一个图片扭转效果"); Image4Show = Visibility.Visible; break;case "TransformGroup":MessageBox.Show("这是一个图片组合效果"); Image5Show = Visibility.Visible; break;case "MatrixTransform":MessageBox.Show("这是一个图片矩阵效果"); Image6Show = Visibility.Visible; break;default: break;}}

③图片显示效果,需要了解RenderTransform类,主要实现以下6中效果:

一. RenderTransform类的成员:

1.TranslateTransform   平移效果

2.RotateTransform     旋转效果

3.ScaleTransform         缩放效果

4.SkewTransform        扭转效果

5.TransformGroup    组合效果

6.MatrixTransform    是其他几个变形类的基类,矩阵方式实现效果

这里的代码较长,可以下载项目源码查看.

二. Visibility属性:

WPF的Visibility属性是个枚举变量,有三种值:Collapsed、Hidden、Visible。

Collapsed与Hidden区别:Hidden仅仅是属性设为不可视,但是属性在画面上依然占有空间。然而使用Collapsed的话,在不可视的基础上,它还能将属性在画面上的占位符清除,属性将彻底不影响画面

namespace System.Windows
{public enum Visibility : byte{Visible = 0,Hidden = 1,Collapsed = 2}
}

后台定义,切记给属性添加get; set;权限,不然界面不会更新

 public Visibility Image6Show { get; set; } = Visibility.Hidden;

在前台绑定就好:

Visibility="{Binding Image6Show}"

三. Image Stretch属性值详解:

namespace System.Windows.Media
{public enum Stretch{None = 0,Fill = 1,Uniform = 2,UniformToFill = 3}
}

None :保持原始尺寸,图片会按原始大小显示

Fill: 缩放到目标尺寸,宽高比不会保留, 图片会按原始大小显示

Uniform:缩放到目标尺寸之内,并保持原始宽高比。图片会按照设置的Width和Height显示,比例会失调

UniformToFill:保持原始宽高比进行缩放,以填充。如果两者的宽高比不同,源会被剪切掉多余的部分。

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

其它的知识点已经在之前讲解过,不懂得话参考以下链接阅读:

C# WPF MVVM项目实战(进阶①)

C# WPF框架Caliburn.Micro入门实例1

C# 项目实战(经典)

02


操作演示

03


结尾

项目源码网盘下载地址

链接:https://pan.baidu.com/s/1uP1Lw96Br1csLaF4B7ZKpw

提取码:  右下角点击再看或者转发,超过20个以后我会在留言区公布!

技术群:添加小编微信zls20210502,备注进群

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

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

相关文章

浏览器要是能这么做就好了

原文地址&#xff1a;http://www.laaan.cn/?p994 之前和搜狗浏览器的开发团队做过一些合作。主要是用户教育方便的事。需要他们给我开几个接口&#xff0c;让flash与浏览器通讯。都是很谨慎的。不过后来想一想&#xff0c;要是搜狗浏览器能开放一些接口供js或flash调用该有多好…

64位的Linux中运行32位的应用程序

安装32位的支持库因为x86_64处理器是为x86技术涉及&#xff0c;所以它也是支持32位程序的。在Linux里&#xff0c;你所需要做的就是为这些软件安装必要的软件库。幸运的是&#xff0c;大部分Linux发行版本已经将这些打包好了。比方在Ubuntu里&#xff0c;这个包就叫做ia32-libs…

腾讯架构师讲解Java接口的继承与抽象类

在实施接口中&#xff0c;我们利用interface语法&#xff0c;将interface从类定义中独立出来&#xff0c;构成一个主体。interface为类提供了接口规范。 在继承中&#xff0c;我们为了提高程序的可复用性&#xff0c;引入的继承机制。当时的继承是基于类的。interface接口同样可…

说说大型高并发高负载网站的系统架构

By Michael 转载请保留出处&#xff1a;俊麟 Michael’s blog (http://www.toplee.com/blog/?p71) Trackback Url : http://www.toplee.com/blog/wp-trackback.php?p71 我在CERNET做过拨号接入平台的搭建&#xff0c;而后在Yahoo&3721从事过搜索引擎前端开发&#xff0c;…

数据库优化的几种方式

数据库的优化有很多方式&#xff0c;下面介绍一下数据库的优化方式。1、选取最适用的字段属性。MySQL可以支持大数据量的存取&#xff0c;但是数据库中的表越小&#xff0c;在上面执行的查询就越快。所以可以将表中的字段宽度设置的尽可能小。2、使用连接来代替子查询&#xff…

删除windows7中的“兼容性疑难解答”右键菜单

windows7中的exe文件右键菜单中有一个“兼容性疑难解答”项&#xff0c;可以检测exe兼容性问题&#xff0c;但对于我们来说一般没有什么用处&#xff0c;检测到问题也不是我们用户能解决的&#xff0c;反而把右键菜单变长了。删除它的方式如下&#xff1a; 把如下文件保存为一个…

java基础之java输入输出语句

1、使用Scanner 使用时需要引入包importjava.util.Scanner;首先定义Scanner对象 Java基础学习&#xff1a;java输入输出语句 比如&#xff1a; Java基础学习&#xff1a;java输入输出语句 2、使用BufferedReader 用前需要引入importjava.io.Reader; Java基础学习&#xff1…

自制WiFiPineapple

什么是WiFiPineapple&#xff1f;关于这个问题&#xff0c;相信各位心里都有自己的答案&#xff0c;这里引用下radiowar的介绍&#xff1a;自从2008开始&#xff0c;WiFi PineApple成为了最受欢迎的安全测试设备&#xff0c;在开源无线安全审计软件社区的支持&#xff0c;WiFiP…

全世界的狗都没有“生殖隔离” | 今日趣图

全世界只有3.14 % 的人关注了青少年数学之旅动物界的“一拳超人”雀尾螳螂虾它有一双力大无比的铁拳出拳速度在五十分之一秒内最大速度可达80km/h产生约60kg的冲击力威力足以匹敌小口径手枪子弹&#xff08;图源冷知君&#xff0c;侵权删&#xff09;如何把清水一秒变可乐&…

聊聊Go的三色标记法

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「203」篇原创敬上大家好&#xff0c;我是 Z 哥。今天带来一篇久违的技术型文章。之前也有不少小伙伴会问&#xff0c;Z 哥你好久没发技术性文章了。其实主要原因有…

asp.net 日期转换

Sql Server中的日期与时间函数 1. 当前系统日期、时间 select getdate() 2. dateadd 在向指定日期加上一段时间的基础上&#xff0c;返回新的 datetime 值 例如&#xff1a;向日期加上2天 select dateadd(day,2,2004-10-15) --返回&#xff1a;2004-10-17 00:…

12种方法返回2个文件路径之间的公共基路径ExtractBasePath

方法一:Boris Kumpar function ExtractBasePath(const Path1,Path2:string):string; const PATH_DELIMITER \; DRIVE_DELIMITER :; var P1,P2:PChar; cnt,j:Integer; begin P1:PChar(Path1) ; P2:PChar(Path2) ; cnt : 1; j : 0; {$B-} while (P1^ <>…

架构师讲解Java中websocket的应用

这篇文章主要来介绍一下在java项目中&#xff0c;特别是java web项目中websocket的应用。 场景&#xff1a;我做了一个商城系统&#xff0c;跟大多数商城系统&#xff0c;分为客户端和后台&#xff0c;客户端供客户浏览&#xff0c;下单&#xff0c;购买&#xff0c;后台主要管…

CocoStudio游戏发布后资源加密大致实现思路

截止到目前&#xff0c;CocoStudio版本已经发展到1.3.0.1&#xff0c;各个子工具间也已经发生了巨大变化。但是&#xff0c;无论是动画编辑器&#xff0c;UI编辑器&#xff0c;场景编辑器还是数据编辑器&#xff0c;它们生成&#xff08;导出&#xff09;的文件在商业开发中往往…

当你死后尸体如何处理?两种新玩法了解一下!

全世界只有3.14 %的人关注了青少年数学之旅据国外媒体报道&#xff0c;死亡是一个庄严肃穆的事情&#xff0c;但是依据不同的文化&#xff0c;人类死亡之后会被认为肉体与灵魂分离&#xff0c;采取的葬礼方式存在很大差异&#xff0c;你想过你的葬礼会是什么样吗&#xff1f;烟…

.NET Core开发实战(定义API的最佳实践)Source Generators版

前言极客时间上的《.NET Core开发实战》是一门非常好的课程&#xff0c;作者肖伟宇在第31课&#xff08;https://time.geekbang.org/course/detail/100044601-201165&#xff09;介绍了定义API的最佳实践。大意如下&#xff1a;Controller这一层负责与前端用户的交互&#xff0…

【转】2007高校BBS上20个睿智的冷笑话

1.真正的浪漫求婚应该是这样的&#xff1a;一位风度翩翩的男子请了10位同事吃饭&#xff0c;其中就有他心仪的mm。吃到一半时&#xff0c;他忽然站起来走到mm身旁&#xff0c;然后把mm坐的椅子整个搬了个90度面朝自己&#xff0c;而此刻mm嘴里塞满了各种食物……这时&#xff0…

多年经验的程序员迷失了自己,该怎么办?

多年的程序员迷失了自己&#xff0c;该怎么办&#xff1f; 本文选自《我也能做CTO之程序员职业规划 》一书 我应该朝哪个方向发展&#xff1f;我不做这行还能做什么&#xff1f;当现实情况与理想目标之间的差距越拉越大时&#xff0c;大多数刚入行的IT人员都会提出这样的问题&a…

大神讲解Java for循环的几种用法

本文非常适合初学Java的程序员&#xff0c;主要是来了解一下Java中的几种for循环用法&#xff0c;分析得十分详细&#xff0c;一起来看看。 J2SE 1.5提供了另一种形式的for循环。借助这种形式的for循环&#xff0c;可以用更简单地方式来遍历数组和Collection等类型的对象。本文…

苍天饶过谁?| 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源人民日报&#xff0c;侵权删&#xff09;