WinFormsでリッチなUIを使いたい
大規模プロジェクトほど環境を移行するのは難しい。
でも最近の?リッチUIは使いたい。
を手軽に実現できないかを調べてた結果。
結果、できた。
環境
- VS2022
- .NET6
プロジェクト構成
WinFormsプロジェクト
↓
WPFラッパープロジェクト
↓
WPFカスタムコントロールプロジェクト
やりたいこと
- ツールボックスから配置できる
- できるだけ移植しやすくする
- リッチに見せられる部分を優先
そもそも仕組み的に可能なのか?
そもそも仕組みが提供されていた。
ElementHost クラス (System.Windows.Forms.Integration) | Microsoft Learn
WPFコントロールの構成
ざっくりこんな感じ
ここまで来たらあとはいける
デザイナで配置できるようにするために
- ラッパークラスは
System.Windows.Forms.Control
から派生 ElementHost
を持ち、自分自身のControls
にAdd
[Serializable] public abstract class WpfUIElementWrapperBase : System.Windows.Forms.Control { private UIElement _element; protected ElementHost Host { get; } protected void RegisterUIElement(UIElement element) { _element = element; Host.Child = _element; } protected WpfUIElementWrapperBase() { Host = new ElementHost(); Host.Location = new System.Drawing.Point(0, 0); Host.Dock = DockStyle.Fill; SuspendLayout(); Controls.Add(Host); InitializeHost(); ResumeLayout(); } protected abstract void InitializeHost(); }
あとは必要なプロパティをラップしていく
Windows フォームと WPF プロパティの割り当て | Microsoft Learn
↑のようなやり方でもできるらしいがWPF使うこと自体今回初めてだったので研究がてら自前で書いてみた。