1. 程式人生 > >查殺程序小工具——WPF和MVVM初體驗

查殺程序小工具——WPF和MVVM初體驗

最近因為工作需要,研究了一下桌面應用程式。在winform、WPF、Electron等幾種技術裡,最終選擇了WPF作為最後的選型。WPF最吸引我的地方,就是MVVM模式了。MVVM模式完全把介面和業務剝離開來,頁面所有操作都通過資料來驅動。更替頁面不用修改業務程式碼邏輯。 以一個查殺程序的小工具來作為初次學習的成果總結。日常開發Java Web程式的時候,程序遇到端口占用問題,通過命令查詢埠、查詢程序、殺死程序,這一套命令敲下來過於麻煩。於是就寫了這麼一個小Demo,即作為學習使用,也為以後工作降低工作量。 ## 需求設計 1. 程序列表:展示所有經常的列表,按照應用名稱正序排序。列表展示程序名、PID、協議、本機IP:埠、遠端IP:埠、程序路徑 2. 搜尋框:進行埠搜尋,在經常列表中展示搜尋結果 3. 重新整理按鈕:重新整理程序列表 4. 殺死按鈕:選中程序,進行程序的殺死。殺死程序後重新整理程序列表 ## 關鍵要點 1. DataContext DataContext主要作用是用於繫結資料來源,預設值為null。 DataContext是FrameworkElement中的一個屬性。而絕大部分的UI元件都繼承路徑中都有FrameworkElement類,所以我們可以認為,大部分UI元件都有DataContext屬性。並且設定了某個物件的DataContext,那麼會對這個物件的所有子物件都會產生同樣的影響。 所以一般來說,我們都會在頂級物件(Window物件)中去設定DataContext屬性。 2. 使用MVVM的意義 使用統一開發模式最大的優點,是統一團隊的思維方式和實現方式,從思維上保持程式碼的整潔。每個理解了模式的人都知道程式碼該怎麼寫。此外,MVVM模式在架構上解耦的比較徹底,資料驅動介面的模式也可讓結構更清晰。由於業務和介面剝離,業務程式碼的可測性、可讀性、可替換性得到提升。所以,既然WPF支援MVVM模式,就不要把WPF寫成WinForm。 3. View 和 ViewModel View是UI、ViewModel是介面的資料模型。ViewModel和View是怎麼溝通的呢?ViewModel只會給View傳遞兩種資料:屬性資料和操作資料。傳遞資料用一般的資料模型來處理,傳遞操作用命令屬性來處理。 ## 專案結構 #### 引用包說明 1. MaterialDesignThemes:主要用於介面的美化,通過NuGet包管理搜尋MaterialDesignThemes直接安裝 2. Prism.Wpf:是實現MVVM的框架,通過NuGet包管理搜尋Prism.Wpf直接安裝 #### 專案目錄結構說明 WinPidKiller 專案名      - Models 業務資料模型層          NetworkInfo.cs 網路埠資料模型          ProcessInfo.cs 程序資料模型     - Services 業務邏輯層          IProcessInfoService.cs 程序業務操作介面          - impl 業務邏輯實現              ProcessInfoService.cs 程序業務操作實現類      - ViewModels 檢視資料模型層,溝通View和Model的重要元件          ProcessItemViewModel.cs 單行程序檢視資料模型(列表中每行資料的模型)          MainWindowViewModel.cs 主檢視資料模型      - Views 介面層      MainWindow.xmal 主視窗檔案 #### 程式碼解釋說明 ###### Models 資料模型僅針對於業務資料 NetworkInfo.cs ``` namespace WinPidKiller.Models { class NetworkInfo { public string Pid { get; set; } public string AgreeMent { get; set; } public string LocalIp { get; set; } public string RemoteIp { get; set; } } } ``` ProcessInfo.cs ``` namespace WinPidKiller.Models { class ProcessInfo { public string Name { get; set; } public string Pid { get; set; } public string AgreeMent { get; set; } public string LocalIp { get; set; } public string RemoteIp { get; set; } } } ``` ###### Services 僅包含ProcessInfoService類,主要實現埠的查詢(通過呼叫cmd程序),程序的獲取和殺死等操作 ProcessInfoService.cs ``` namespace WinPidKiller.Services.Impl { class ProcessInfoService : IProcessInfoService { /** * 若port為空則獲取所有程序資訊 * 若port不為空則獲取佔用port的執行緒 */ public List