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:保持原始宽高比进行缩放,以填充。如果两者的宽高比不同,源会被剪切掉多余的部分。
02
—
结尾
项目源码网盘下载地址
链接:https://pan.baidu.com/s/1uP1Lw96Br1csLaF4B7ZKpw
提取码: a365
技术群:添加小编微信zls20210502,备注进群!
C# WPF MVVM项目实战(进阶②)的更多相关文章
- C# WPF MVVM QQ密码管家项目(8,完结篇:自动输入QQ号、密码)
原文:C# WPF MVVM QQ密码管家项目(8,完结篇:自动输入QQ号.密码) 目录: 1,界面设计 2,数据模型的建立与数据绑定 3,添加QQ数据 4,修改QQ数据 5,删除QQ数据 6,密码选 ...
- 彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-项目入口与路由EP01
书接上回,我们已经安装好Iris框架,并且构建好了Iris项目,同时配置了fresh自动监控项目的实时编译,万事俱备,只欠东风,彩虹女神蓄势待发.现在我们来看看Iris的基础功能,如何编写项目入口文件 ...
- 项目实战12.2—企业级监控工具应用实战-zabbix操作进阶
无监控,不运维.好了,废话不多说,下面都是干货. 流量党勿入,图片太多!!! 项目实战系列,总架构图 http://www.cnblogs.com/along21/p/8000812.html 一.U ...
- mxgraph进阶(三)Web绘图——mxGraph项目实战(精华篇)
Web绘图--mxGraph项目实战(精华篇) 声明 本文部分内容所属论文现已发表,请慎重对待. 需求 由于小论文实验需求,需要实现根据用户日志提取出行为序列,然后根据行为序列生成有向图的形式 ...
- AngularJS进阶(三十九)基于项目实战解析ng启动加载过程
基于项目实战解析ng启动加载过程 前言 在AngularJS项目开发过程中,自己将遇到的问题进行了整理.回过头来总结一下angular的启动过程. 下面以实际项目为例进行简要讲解. 1.载入ng库 2 ...
- 【WPF入门视频】Microsoft ToDo 应用项目实战
项目实战视频地址 第一天 第二天 第三天 第四天 第五天 第六天 项目实战源代码下载地址: 项目源代码下载
- WPF MVVM 验证
WPF MVVM(Caliburn.Micro) 数据验证 书接前文 前文中仅是WPF验证中的一种,我们暂且称之为View端的验证(因为其验证规是写在Xaml文件中的). 还有一种我们称之为Model ...
- WPF MVVM初体验
首先MVVM设计模式的结构, Views: 由Window/Page/UserControl等构成,通过DataBinding与ViewModels建立关联: ViewModels:由一组命令,可以绑 ...
- angularJs项目实战!01:模块划分和目录组织
近日来我有幸主导了一个典型的web app开发.该项目从产品层次来说是个典型的CRUD应用,故而我毫不犹豫地采用了grunt + boilerplate + angularjs + bootstrap ...
随机推荐
- web项目中的浏览器行为和服务器行为
package day10.think_about_path; import java.io.IOException; import javax.servlet.ServletException; i ...
- Spring Mvc原理分析(一)
Servlet生命周期了解 Servlet的生命(周期)是由容器(eg:Tomcat)管理的,换句话说,Servlet程序员不能用代码控制其生命. 加载和实例化:时机取决于web.xml的定义,如果有 ...
- C# - 习题05_写出程序的输出结果o1.count
时间:2017-08-24 整理:byzqy 题目:写出下列程序的输出结果: //原题程序如下: class Class1 { private static int count = 0; static ...
- 学习 Webpack5 之路(优化篇)
一.前言 从 0 到 1 学习的朋友可参考前置学习文章: 学习 Webpack5 之路(基础篇) 学习 Webpack5 之路(实践篇) 前置文章 学习 Webpack5 之路(基础篇) 对 webp ...
- You have mail in /var/mail/xxx
因为配置 DDNS, 我添加了个 crontab 定时任务,每隔 1 分钟执行一段 python 脚本 然后就发现 terminal 经常提示 'You have mail in /var/mail/ ...
- vue 打开新窗口进行打印
父文件 let { href } = this.$router.resolve({ path: ' 自己配置本地路由,不需要动态路由 ', query: 个人建议传一整个对象 }) window.op ...
- vue + WangEnduit
components 注册组件 <template lang="html"> <div class="editor"> <div ...
- 从零开始实现简单 RPC 框架 8:网络通信之 Request-Response 模型
Netty 在服务端与客户端的网络通信中,使用的是异步双向通信(双工)的方式,即客户端和服务端可以相互主动发请求给对方,发消息后不会同步等响应.这样就会有一下问题: 如何识别消息是请求还是响应? 请求 ...
- 20210501 序列,熟练剖分(tree),建造游乐园(play)
考场 \(65+5+0\),并列 rk2 最高分 \(55+10+10\) T1:等比数列可以写作 \(q^kx\),发现 \(q\le1000\) 且有一档分为 \(a_i\le100\),想到 \ ...
- 《Go语言圣经》阅读笔记:第三章基础数据类型
第三章 基础数据类型 Go语言将数据类型分为四类: 基础类型 数字 整数 浮点数 复数 字符串 布尔 复合类型 数据 结构体 引用类型 指针 切片 字典 函数 通道 接口类型 在此章节中先介绍基础类型 ...