这篇文章还是在之前用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项目实战(进阶②)的更多相关文章

  1. C# WPF MVVM QQ密码管家项目(8,完结篇:自动输入QQ号、密码)

    原文:C# WPF MVVM QQ密码管家项目(8,完结篇:自动输入QQ号.密码) 目录: 1,界面设计 2,数据模型的建立与数据绑定 3,添加QQ数据 4,修改QQ数据 5,删除QQ数据 6,密码选 ...

  2. 彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-项目入口与路由EP01

    书接上回,我们已经安装好Iris框架,并且构建好了Iris项目,同时配置了fresh自动监控项目的实时编译,万事俱备,只欠东风,彩虹女神蓄势待发.现在我们来看看Iris的基础功能,如何编写项目入口文件 ...

  3. 项目实战12.2—企业级监控工具应用实战-zabbix操作进阶

    无监控,不运维.好了,废话不多说,下面都是干货. 流量党勿入,图片太多!!! 项目实战系列,总架构图 http://www.cnblogs.com/along21/p/8000812.html 一.U ...

  4. mxgraph进阶(三)Web绘图——mxGraph项目实战(精华篇)

    Web绘图--mxGraph项目实战(精华篇) 声明     本文部分内容所属论文现已发表,请慎重对待. 需求 由于小论文实验需求,需要实现根据用户日志提取出行为序列,然后根据行为序列生成有向图的形式 ...

  5. AngularJS进阶(三十九)基于项目实战解析ng启动加载过程

    基于项目实战解析ng启动加载过程 前言 在AngularJS项目开发过程中,自己将遇到的问题进行了整理.回过头来总结一下angular的启动过程. 下面以实际项目为例进行简要讲解. 1.载入ng库 2 ...

  6. 【WPF入门视频】Microsoft ToDo 应用项目实战

    项目实战视频地址 第一天 第二天 第三天 第四天 第五天 第六天 项目实战源代码下载地址: 项目源代码下载

  7. WPF MVVM 验证

    WPF MVVM(Caliburn.Micro) 数据验证 书接前文 前文中仅是WPF验证中的一种,我们暂且称之为View端的验证(因为其验证规是写在Xaml文件中的). 还有一种我们称之为Model ...

  8. WPF MVVM初体验

    首先MVVM设计模式的结构, Views: 由Window/Page/UserControl等构成,通过DataBinding与ViewModels建立关联: ViewModels:由一组命令,可以绑 ...

  9. angularJs项目实战!01:模块划分和目录组织

    近日来我有幸主导了一个典型的web app开发.该项目从产品层次来说是个典型的CRUD应用,故而我毫不犹豫地采用了grunt + boilerplate + angularjs + bootstrap ...

随机推荐

  1. Quartz任务调度(2)CronTrigger定制个性化调度方案

    Cron表达式 1. 时间字段与基本格式 Cron表达式有6或7个空格分割的时间字段组成: 位置 时间域名 允许值 允许的特殊字符 1 秒 0-59 ,-*/ 2 分支 0-59 ,-*?/ 3 小时 ...

  2. JavaWeb之JavaMail

    时间:2016-12-19 11:58 --邮件协议1.收发邮件    发邮件是从客户端把邮件发送到服务器,收邮件是把邮件服务器的邮件下载到客户端    2.邮件协议概述    与HTTP协议相同, ...

  3. Docker与数据:三种挂载方式

    操作系统与存储 操作系统中将存储定义为 Volume(卷) ,这是对物理存储的逻辑抽象,以达到对物理存储提供有弹性的分割方式.另外,将外部存储关联到操作系统的动作定义为 Mount(挂载). Dock ...

  4. 前端 | 页面触底自动加载 Vue 组件

    不管是 web 端还是移动端,信息流都是现在很流行的信息展示方式.信息流经常搭配自动加载一起使用以获得更好的使用体验. 最近在使用 Vue 开发过程中也遇到了首页信息流自动加载的需求.大致了解了一下几 ...

  5. 五分钟搞定Docker安装ElasticSearch

    前言 项目准备上ElasticSearch,为了后期开发不卡壳只能笨鸟先飞,在整个安装过程中遇到以下三个问题. Docker安装非常慢 ElasticSearch-Head连接出现跨域 Elastic ...

  6. ubuntu中用update-alternatives进行软件多版本设置、切换,以python配置为例

    以Python2.7和Python3.5设置为例: 在系统中添加Python2.7.Python3.5的选项,默认为Python3.5 sudo update-alternatives --insta ...

  7. python--接口自动化经常用到的pytest框架

    pytest常用的方法和原理 1.pytest的原理 pytest插件基于pluggy模块:pluggy有三个重要概念:HookspecMarker(用来定义hook函数),HookimplMarke ...

  8. 如何实现CSS限制字数,超出部份显示省略号

    <div style="width:200px; white-space:nowrap;overflow:hidden;text-overflow:ellipsis; border:1 ...

  9. 【Spring 5.x】学习笔记汇总

    Spring 工厂 工厂设计模式.第一个Spring程序细节分析.整合日志框架 注入详解 - Set注入(JDK内置类型,用户自定义类型).构造注入(重载) 反转控制与依赖注入.Spring工厂创建复 ...

  10. SpringBoot - 搭建静态资源存储服务器

    目录 前言 环境 实现效果 具体实现 文件上传 配置类 上传接口 上传实现 辅助类 实体 上传测试 文件访问 配置类 项目源码 前言 记录下SpringBoot下静态资源存储服务器的搭建. 环境 wi ...