今からでも間に合う

技術を学ぶのは今からでも遅くない

WPFのコントロールをWinFormsで使う

WinFormsでリッチなUIを使いたい

大規模プロジェクトほど環境を移行するのは難しい。
でも最近の?リッチUIは使いたい。
を手軽に実現できないかを調べてた結果。

WPFコントロールをWinFormsで表示

結果、できた。

環境

  • VS2022
  • .NET6

プロジェクト構成

WinFormsプロジェクト

WPFラッパープロジェクト

WPFカスタムコントロールプロジェクト

やりたいこと

  • ツールボックスから配置できる
  • できるだけ移植しやすくする
  • リッチに見せられる部分を優先

そもそも仕組み的に可能なのか?

そもそも仕組みが提供されていた。

ElementHost クラス (System.Windows.Forms.Integration) | Microsoft Learn

WPFコントロールの構成

ざっくりこんな感じ

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使うこと自体今回初めてだったので研究がてら自前で書いてみた。

ソースコード

github.com

プライバシーポリシー


d払いポイントGETモール