C# WPF - MVVM實現OPC Client管理系統
阿新 • • 發佈:2020-06-18
前言
本文主要講解採用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) => { // 業務邏輯 }); } }View Code
相關類的定義程式碼如下:
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/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。