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

ソリュージョンエクスプローラーを右クリックし、メニューから「プロジェクトファイルの編集」を選択します。
これで「.csprj」を編集できるようになります。
AIで、「.csprj」を編集します、と言う回答があった場合は、このようにして編集状態にします。(これに気づくまで苦労した~)

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

そしたら</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;
}
コメント