▲

把 WinForms 製作的工具 都 換到 WPF

· 紀錄
Section image

最近花了不少時間
將之前自己製作的 小工具 陸續重新製作

原本大多使用
C語言
Windows Forms
(WinForms)

決定重做一部份工具
換到
Windows Presentation Foundation
(WPF)

並不是 WinForms 不能用了
對於一般的小型工具來說
WinForms 開發速度快
使用起來也很直接
WinForms 可以將功能
都累積在同一個主要視窗類別
介面操作、設定存取、鍵盤滑鼠控制、Windows API
都可以集中在同一個地方
寫法很方便
但隨著功能增加
一個小地方的修改
就可能影響其他原本正常的功能

隨著自己製作的工具
功能越來越複雜
原本的架構
逐漸變得不容易維護
尤其常常因為
每個人螢幕DPI設定不同
導致顯示上不完全
尤其 介面、按鈕、設定欄位、動態清單
版面管理顯得比較麻煩

當然
也不是 WinForms
不能製作不同DPI的相容
在 WinForms 製作的工具
我也已經將
100%~250% DPI
都各別做了不同DPI調整
但 後續 新增版面
可能又得回頭檢查

現在使用高解析度螢幕
已經很普遍
像是 2K、4K
搭配 125%、150%、200% 等
不同的顯示縮放比例
如果程式沒有正確處理 DPI
就很容易出現
文字模糊、控制項錯位、視窗尺寸異常
甚至按鈕被裁切等問題

尤其是
使用兩台
不同縮放比例的螢幕
把視窗 拖曳 到另一台螢幕
問題通常會更加明顯

這也是我主要想用 WPF 重新製作的原因

WPF採用不同的介面設計
利用 XAML 描述介面
並使用 C語言 處理程式邏輯讓
介面設計 與 功能實作
能夠更清楚分開
在設計較複雜的介面時
擁有更高的彈性

但
這不代表換成 WPF 就一定比較快
或 記憶體使用量一定比較低

因此這次重做時
也將部分功能拆分成獨立的
Services、Views 與其他 C# 類別
例如
視窗、快捷鍵、設定檔
以及滑鼠鍵盤事件的處理
都可以分別管理

這次WPF
主要改採 Per-Monitor V2
簡單來說
就是讓應用程式
能夠依照目前所在螢幕的 DPI
重新調整介面顯示
而不是只依賴程式啟動時取得的縮放比例

WPF 的版面配置也主要使用
Device-Independent Pixels(DIP)
配合適當的版面設計
可以降低不同 DPI 對介面造成的影響

我以平常使用的 2560 × 1600 150% 縮放
作為主要設計基準
再針對 100%~250%
縮放比例與跨螢幕
進行測試
目前已經完成幾個工具
都有明顯改善

另外
部分工具 因為使用
全域快捷鍵、視窗控制或底層輸入相關功能
建議使用
系統管理員權限 執行

很多功能都重新寫過
盡量保留原本的設定格式
可以減少重新設定的麻煩
方便新舊版本之間的資料銜接

這次重新整理這些工具
其實也算是重新檢視
自己過去寫程式的方式
從最早
只想做出一個能解決問題的小工具
到後來功能越加越多
逐漸變成
需要長期維護

才發現
能正常執行
和
容易長期維護
是兩件不同的事情

選擇 WPF
並不是因為舊技術已經不能用了
而是希望自己製作的工具
更容易繼續更新

這些工具
最初就是
因為自己有需要才開始製作的

既然 已經花了這麼多時間開發
也希望不只是現在能用
而是 未來需要 修改 更新 增加功能
還能夠繼續維護下去