C# WPF - MVVM实现OPC Client管理系统
前言
本文主要讲解采用WPF MVVM模式设计OPC Client的过程,算作对于WPF MVVM架构的学习记录吧!不足之处请不吝赐教,感谢!
涉及知识点
- C#基础
- Xaml基础
- 命令、通知和数据绑定
- Prism+Blend
- MahApps.Metro(第三方框架)
- OPC
项目实现功能
- 用户登陆(模拟登陆过程,未连接数据库)
- OPC同步读写、异步读写操作等
开发环境
- Window 10
- Visual Studio 2019
- .Net Framework 4.8
成品效果图

项目详解
MVVM框架搭建
为了节省开发时间,在事件绑定上使用了Prism框架,OPC通信方面使用了OPCDAAuto.dll类库,二者均可以通过Nuget方式安装到项目中。
- 定义了一个DelegateCommand类用来处理属性和命令;
- 定义了一个NotificationObject类用来通知属性和命令的改变;
注意:在使用事件绑定时,需要添加引用 xmlns:i="http://schemas.microsoft.com/xaml/behaviors",然后根据控件对应事件的名称设置绑定命令即可。
比如我们想给ComboBox的SelectionChanged事件设置一个事件绑定,可这么写
xaml代码:

<ComboBox
x:Name="CombServerList"
Width="120"
Margin="{StaticResource ControlMargin}"
ItemsSource="{Binding ServerList}">
<!-- 事件绑定 -->
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding SelectionChangedCommand}" CommandParameter="{Binding ElementName=CombServerList}" />
</i:EventTrigger>
</i:Interaction.Triggers> </ComboBox>
VM代码:

public ICommand SelectionChangedCommand
{
get
{
return new Prism.Commands.DelegateCommand<ComboBox>((combobox) =>
{
// 业务逻辑
});
}
}
相关类的定义代码如下:

public class DelegateCommand : ICommand
{
public event EventHandler CanExecuteChanged; /// <summary>
/// 判断判断命令是否可以被执行
/// </summary>
/// <param name="parameter"></param>
/// <returns></returns>
public bool CanExecute(object parameter)
{
if (this.CanExecuteFunc != null)
{
this.CanExecuteFunc(parameter);
}
else
{
return true;
}
return false;
} /// <summary>
/// 执行相关的函数或者命令
/// </summary>
/// <param name="parameter"></param>
public void Execute(object parameter)
{
if (this.ExecuteAction != null)
{
this.ExecuteAction(parameter);
}
else
{
return;
}
} /// <summary>
/// 声明一个委托用来执行命令对应的方法
/// </summary>
public Action<object> ExecuteAction { get; set; } /// <summary>
/// 声明一个方法,用来判断命令是否可以被执行
/// </summary>
public Func<object, bool> CanExecuteFunc { get; set; } }
DelegateCommand

public class NotificationObject : INotifyPropertyChanged
{
/// <summary>
/// 实现接口
/// </summary>
public event PropertyChangedEventHandler PropertyChanged; /// <summary>
/// 通知属性的改变
/// </summary>
/// <param name="propertyName"></param>
public void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
NotificationObject
UI界面搭建
这里主要采用第三方开源框架MahApps.Metro,可以通过NuGet方式安装到项目中,这里不再展开讲解,感兴趣的朋友可以参考 MahApps.Metro - Quick Start
OPC相关处理
大致分为如下几步:
- 获取OPC服务列表
- 连接OPC服务
- 创建分组
- 获取项目列表
- 添加项目到分组中
- 对项目的内容进行读写操作
比较简单,不再展开了。
登陆界面
这里我们说一说登陆界面的实现,由于追求PURE MVVM,所以这里有三点需要说明一下:
- PasswordBox绑定
- 圆形头像
- 登陆窗体切换
PasswordBox绑定:自定义帮助类,使用PasswordBoxBehavior实现绑定;
圆形头像:自定义样式,增加Image圆角属性;
登陆窗体切换:借助prism的shell。
至此,已全部结束。
作者:Jeremy.Wu
出处:https://www.cnblogs.com/jeremywucnblog/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
C# WPF - MVVM实现OPC Client管理系统的更多相关文章
- WPF MVVM 验证
WPF MVVM(Caliburn.Micro) 数据验证 书接前文 前文中仅是WPF验证中的一种,我们暂且称之为View端的验证(因为其验证规是写在Xaml文件中的). 还有一种我们称之为Model ...
- 关于OPC的研究1]c# opc client源码调试和学习笔记
c# opc client是一个在网上下载的示例程序,调试的时候还是费了一番周折,服务器端程序来自king view6.55,另文介绍. 1.注册dll 程序中有一个名叫OPCDAAuto.dll的文 ...
- WPF MVVM初体验
首先MVVM设计模式的结构, Views: 由Window/Page/UserControl等构成,通过DataBinding与ViewModels建立关联: ViewModels:由一组命令,可以绑 ...
- WPF MVVM实现TreeView
今天有点时间,做个小例子WPF MVVM 实现TreeView 只是一个思路大家可以自由扩展 文章最后给出了源码下载地址 图1 图2 模版加上了一个checkbox,选中父类的checkb ...
- WPF/MVVM 快速开始指南(译)(转)
WPF/MVVM 快速开始指南(译) 本篇文章是Barry Lapthorn创作的,感觉写得很好,翻译一下,做个纪念.由于英文水平实在太烂,所以翻译有错或者译得不好的地方请多指正.另外由于原文是针对W ...
- A WPF/MVVM Countdown Timer
Introduction This article describes the construction of a countdown timer application written in C# ...
- 使用Prism提供的类实现WPF MVVM点餐Demo
使用Prism提供的类实现WPF MVVM点餐Demo 由于公司开发的技术需求,近期在学习MVVM模式开发WPF应用程序.进过一段时间的学习,感受到:学习MVVM模式,最好的方法就是用MVVM做几个D ...
- WPF MVVM使用prism4.1搭建
WPF MVVM使用prism4.1搭建 MVVM即Model-View-ViewModel,MVVM模式与MVP(Model-View-Presenter)模式相似,主要目的是分离视图(View)和 ...
- 《连载 | 物联网框架ServerSuperIO教程》- 18.集成OPC Client,及使用步骤
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
随机推荐
- Docker入门 安装Tomcat以及报404解决方案
时间:2020/1/18 17:34:09 浏览:24 来源:互联网 记录简单的在Docker 上安装Tomcat 首先我是在云服务器上(Centos系统)安装的Docker,我们需要在https:/ ...
- js中 addEventListener 和removeEventListener
js中添加事件监听本来是非常常见的事情,但是去除监听一般很少去干,最近项目中需要监听页面显示或者隐藏 代码如下 document.addEventListener(visibilitychange', ...
- [JavaWeb基础] 032.第三方插件pinyin4j的使用
突然发现了一个比较新奇的插件,就是可以把我们输入的汉字,输出它所有的拼音的jar包.下面以代码的形式简单的介绍下这个插件 package com.babybus.sdteam.pinyin4j; im ...
- [注]6W运营法则教你盘活社区内容运营
社区运营人员大体分为两种:一种是内容运营,这类人才基于产品,一般对文字以及对广告文案比较敏感:另外一种则是更多基于产品推广运营,前者需要把内容最大化地曝光,后者则是把产品推送给用户,两者的是相辅相成, ...
- java基础-HelloWorld
public class HelloWorld{//源文件中只能有一类声明为public , 且类名和源文件名得一样 //main方法,程序的入口 public static void main(St ...
- 慕零的黑夜-头条-第一期(必问)[导读:]1.CSDN必问赏金流向何方 2.CSDN必问偷偷做的手脚 3.CSDN必问靠谱吗 4.关于钱于回答的平衡问题:一美元拍卖骗局 作者:qq3461896724
本期是关于CSDN 必问 (biwen.csdn.net)的内容,欢迎评论 文末,文中插入有 小姐姐 img(附py代码,1.49G) + coding资料 哟~~~ 你看到这篇很可能是在提问.推荐加 ...
- 【Python】基础总结
输入 input("提示性信息") 如: input("请输入数字") 评估函数 因为 Python 没有特别人为规定数据类型,数据类型是由计算机进行判定,所以 ...
- python九九乘法表程序代码
按照c语言的思路来考虑python的,方法很简单,直接运用双重循环即可,本代码为了代码量少采用的是while嵌套双循环. 取两个随机变量 (1)i和j都从1开始(因为表中最小数值为1) (2)i控制第 ...
- fastjson漏洞利用备忘
预备知识: 起rmi服务 用marshalsec-0.0.3-SNAPSHOT-all.jar起一个rmi服务. java -cp marshalsec-0.0.3-SNAPSHOT-all.jar ...
- 关于oauth安全
白话认证流程 A)用户打开客户端以后,客户端要求用户给予授权.(比如说你登陆淘宝,通过QQ这个第三方来登录时,这个时候淘宝将你引导至QQ的认证服务器) B)用户同意给客户端授权.(这个时候在你手机上弹 ...