WPFでFormsを使うには

WPF(Windows Presentation Foundation)は、Formsの後継として開発されましたが、異なるUIフレームワークのため、Formsで使えたような(例えば標準ダイアログの細かい制御)当たり前のようなことが出来なくなっています。
ただし、暫定的な以降手段として「Formsコントロール」をWPFでも使うことが出来ます。

Visual StudioのWPFでFormsを使うようにする

プロジェクト名を右クリック

ソリュージョンエクスプローラーを右クリックし、メニューから「プロジェクトファイルの編集」を選択します。
これで「.csprj」を編集できるようになります。

AIで、「.csprj」を編集します、と言う回答があった場合は、このようにして編集状態にします。(これに気づくまで苦労した~)

プロジェクトファイルの編集

このようにプロジェクトファイルの編集タブが追加されました。

ItemGroupを加える

そしたら</Project>の前あたりに以下のタグを加えます。

<ItemGroup>
  <FrameworkReference Include="Microsoft.WindowsDesktop.App.WindowsForms" />
</ItemGroup>
ファイルを保存する

ここまで終了したら、保存ボタンを押してプロジェクトファイルを保存します。

リビルド

続いてソリューションのリビルドをおこないます。

ソリューションのリビルド

メニューの「ビルド」をクリックし、「ソリューションのリビルド」を選択します。

リビルドが完了すると使えるようになっているはずです。

あいまいな参照

System.Windows.Formsを使うと、同じ名前のメソッドなどがダブって以下のようなエラーが出る場合があります。

上の例は、「OpenFileDialog」メソッドは、System.Windows.FormsとMicrosoft.Win32.OpenFileDialogの両方にあるけれど、どっちのこと?と言うエラー。
この場合はメソッドの名前だけでなく、フルパスで記述してやります。

このように、System.Windows.Formsを使えるようにすると、今までエラーがなかった部分にエラーが表示されることも。

この場合は、使いたい方のパスを書いてやればいい。

var dialog = new System.Winodws.Forms.OpenFileDialog
{

問題点

WPFでFormsを使うと、高DIPで表示がぼやける可能性があります。
WPF版は高DIP環境で自動スケーリングされ、きれいに表示されます。

違い

ダイアログを表示させる場合、Formsの場合とWPFでは以下のようになります。

Formsの場合

var dialog = new System.Windows.Forms.OpenFileDialog();
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
{
    string file = dialog.FileName;
}

WPFの場合

var dialog = new Microsoft.Win32.OpenFileDialog();
if (dialog.ShowDialog() == true) // WPF は `bool?` を返す
{
    string file = dialog.FileName;
}

コメント

タイトルとURLをコピーしました