前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C# WPF MVVM项目实战(进阶②)

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

作者头像
zls365
发布于 2021-10-19 03:03:57
发布于 2021-10-19 03:03:57
1.4K00
代码可运行
举报
文章被收录于专栏:CSharp编程大全CSharp编程大全
运行总次数:0
代码可运行

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

01

重要的知识点

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ImageProcessViewModel : Caliburn.Micro.Screen

-. 在nuget中引用PropertyChanged.Fody

并在类之前添加:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 [AddINotifyPropertyChangedInterface]

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

②TreeView用法实例:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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的话,在不可视的基础上,它还能将属性在画面上的占位符清除,属性将彻底不影响画面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace System.Windows
{
    public enum Visibility : byte
    {
        Visible = 0,
        Hidden = 1,
        Collapsed = 2
    }
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public Visibility Image6Show { get; set; } = Visibility.Hidden;

在前台绑定就好:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Visibility="{Binding Image6Show}"

三. Image Stretch属性值详解:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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个以后我会在留言区公布!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSharp编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Drawer 抽屉控件的实现
定义了一个名为 Drawer 的自定义控件,继承自 HeaderedContentControl,允许用户在应用程序中创建可展开和收起的抽屉。抽屉的显示和隐藏动画通过 Storyboard 实现,支持从不同方向(左、上、右、下)展开和收起。
郑子铭
2024/12/09
990
Drawer 抽屉控件的实现
C# 扩展集合ObservableCollection使集合在添加、删除、值变更后触发事件
ObservableCollection继承了INotifyPropertyChanged接口,在属性变更时可以通知界面,当我把ObservableCollection集合绑定到界面的DataGrid后,我希望在界面修改表格数值后,可以触发一个 事件来验证我界面设定数据的有效性,但是对于集合的添加、删除只会触发集合的get属性,值重置不会触发集合的get、set属性,这时候我们就需要扩展ObservableCollection集合.
用户9127601
2022/01/13
1.8K0
C# 扩展集合ObservableCollection使集合在添加、删除、值变更后触发事件
WPF 实现带蒙版的 MessageBox 消息提示框
Nuget[1] Install-Package WPFDevelopers.Minimal
独立观察员
2022/12/06
1.2K0
WPF 实现带蒙版的 MessageBox 消息提示框
【NEW】WPF MVVM 模式下自写自用的窗口样式
SVG是一种图形文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。它是基于XML(Extensible Markup Language),由World Wide Web Consortium(W3C)联盟进行开发的。严格来说应该是一种开放标准的矢量图形语言,可让你设计激动人心的、高分辨率的Web图形页面。用户可以直接用代码来描绘图像,可以用任何文字处理工具打开SVG图像,通过改变部分代码来使图像具有交互功能,并可以随时插入到HTML中通过浏览器来观看。
Shunnet
2022/09/01
2.4K0
【NEW】WPF MVVM 模式下自写自用的窗口样式
Win8 连连看 第二季(1)
思路如下:暂定游戏中图标有100个(10行10列),对每个小图标用用户控件进行展示(好处很多方便绑定数据,链接事件,实现动画效果等)。
aehyok
2018/09/11
2700
另一种方法实现silverlight图片局部放大效果
  一時技痒于是也打算做一个出来。因为功能简单不如索性用纯xaml做,不写一行代码。当然,MouseDragElementBehavior这种东西也是要用到的,但这也不算是“我”写了代码吧。   原以为会很简单,结果失败了。MouseDragElementBehavior有一个属性是ConstrainToParentBounds,即是否只在父容器的范围中拖动。这个属性理所当然地应该设置为True,但实际上只要鼠标一移出父容器被拖动的控件就完全不动了。实际效果如下,为了方便比较做了 ConstrainToParentBounds="False" 和 ConstrainToParentBounds="True"两种。 这个东西做出来的效果不是很理想,难登大雅之堂,如果需要实际使用还是老老实实地用上面那篇文章介绍的方法吧。
dino.c
2019/01/18
6790
另一种方法实现silverlight图片局部放大效果
C# WPF框架Caliburn.Micro入门实例1
详细介绍了一个最简单的Caliburn.Micro框架如何搭建起来,今天我们接着上次的话题继续讲解。
用户9127601
2021/11/01
7340
C# 制作指示灯(经典)
①安装PropertyChanged.Fody,using PropertyChanged;然后在类前面添加 [AddINotifyPropertyChangedInterface],类中所有属性变更后就会自动通知界面变更;
用户9127601
2022/03/23
2K0
C# 制作指示灯(经典)
C# wpf编程CM框架快速入门项目实例
将导致TextBox的“Text”属性绑定到ViewModel的“FirstName”属性。
用户9127601
2021/12/29
8650
C# wpf编程CM框架快速入门项目实例
C# CM框架下打造符合MVVM思想的WPF登录窗体
登录信息验证:这里按理应该增加注册信息,应该是个list,我只是举例写了一组:
用户9127601
2022/04/19
7880
C# CM框架下打造符合MVVM思想的WPF登录窗体
WPF MVVM实现TreeView
今天有点时间,做个小例子WPF MVVM 实现TreeView 只是一个思路大家可以自由扩展 文章最后给出了源码下载地址 图1    图2     模版加上了一个checkbox,选中父类的chec
lpxxn
2018/01/31
3K1
WPF MVVM实现TreeView
WPF MVVM 模式下自写自用的窗口样式
废话我也就不多说,直接上菜(由于公司电脑做了加密,无法把代码压缩发布,只能以这种方式来分享)
Shunnet
2022/09/01
1.6K0
WPF MVVM 模式下自写自用的窗口样式
C1WPF制作OLAP Cube浏览工具
经过前期一段时间对WPF的学习了解,相信大家对WPF有了一定的了解。今天我们一起来了解使用Component One(简称C1)的WPF控件制作CUBE浏览工具。其实这个OLAP控件官方已经有了很详细的示例。
黄昏前黎明后
2019/08/26
5580
C1WPF制作OLAP Cube浏览工具
精通 WPF UI Virtualization
    本篇博客主要说明如何使用 UI Virtualization(以下简称为 UIV) 来提升 OEA 框架中 TreeGrid 控件的性能,同时,给出了一些学习 UIV 的资源。 问题     最近对 OEA 的 TreeGrid 控件进行了比较大的改造,并使用新的控件来替换了系统中所有的 DataGrid 控件。新的 TreeGrid 控件实现了很多新的功能,(之后会写一篇文章说明),但是最后遗留了一个问题:由于使用它替换了原来的 DataGrid,而 DataGrid 默认是支持 UI Virtu
用户1172223
2018/01/29
2.4K0
精通 WPF UI Virtualization
C# WPF MVVM开发框架Caliburn.Micro快速搭建③
既然Caliburn.Micro更喜欢ViewModel优先的方法,让我们从这里开始。
用户9127601
2022/01/13
1.6K0
C# WPF MVVM开发框架Caliburn.Micro快速搭建③
C#项目实战练习:做自己的QQ
  C#程序设计实战练习项目,做一个类似于QQ的软件,程序参考明日科技出版的《C#项目开发入门实战》第一章:Q友,做自己的QQ。
小孙同学
2022/01/17
7.6K0
C#项目实战练习:做自己的QQ
【愚公系列】2023年10月 WPF控件专题 TreeView控件详解
WPF控件是Windows Presentation Foundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。
愚公搬代码
2023/10/15
9000
C# 值得永久收藏的WPF项目实战(经典)
C# WPF mvvm模式下combobox绑定(list<enum>、Dictionary<int,string>)
用户9127601
2021/12/17
5K1
C# 值得永久收藏的WPF项目实战(经典)
【愚公系列】2024年01月 GDI+绘图专题 DrawImage
在WinForm中,可以使用Graphics类的DrawImage方法来绘制图像。具体步骤如下:
愚公搬代码
2024/01/03
4370
C# WPF后台动态添加控件(经典)
在Winform中从后台添加控件相对比较容易,但是在WPF中,我们知道界面是通过XAML编写的,如何把后台写好的控件动态添加到前台呢?本节举例介绍这个问题。
用户9127601
2022/06/09
3.5K0
C# WPF后台动态添加控件(经典)
相关推荐
Drawer 抽屉控件的实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文