1. 程式人生 > >C# WPF - MVVM實現OPC Client管理系統

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>
View Code

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/
  本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。