查殺程序小工具——WPF和MVVM初體驗
阿新 • • 發佈:2020-10-09
最近因為工作需要,研究了一下桌面應用程式。在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