前言
本文主要講解采用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>
View Code
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/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。