0. はじめに
Freeradicalの中の人、yamarahです。
いつまでもWinFormsではつらいので、WPFを使おうという話しです。
WPF自体については解説しません。Formの代わりにWPFのWindowを表示するには、どうすれば良いのかを説明します。
1. ProjectにWPFを追加するための準備
Visual Studio → ソリューション エクスプローラー
で右クリック → 追加
→ 新しい項目
で'WPF'が無い場合があります。
上の画像にはWPF
がありますが、もし見当たらない場合は、ProjectでUseWPF
をtrue
にします。
これで、新しい項目の追加
にWPF
が表示されるはずです。
また、実際にWPFのWindowを追加した後に、
Windows デスクトップ アプリケーションを作成するには、Microsoft.NET.Sdk.WindowsDesktop が必要です。現在の SDK では、'UseWpf' と 'UseWindowsForms' はサポートされていません。
と警告が出る場合があります。この場合は、警告に従って、Projectの1行目を
<ProjectSdk="Microsoft.NET.Sdk.WindowsDesktop">
に変更しましょう。
これらの変更を施したProjectの冒頭部分は、このようになると思います。
<ProjectSdk="Microsoft.NET.Sdk.WindowsDesktop"><PropertyGroup><OutputType>Library</OutputType><TargetFramework>net472</TargetFramework><UseWPF>true</UseWPF><RootNamespace>InvAddIn</RootNamespace><LangVersion>8.0</LangVersion><Nullable>enable</Nullable></PropertyGroup>
以前の記事(C#8.0、そして.NET Core3.0)に従って、nullable
も有効にしています。
2. 実際に表示する
表示するだけなら、単純に
varwpfWindow=newWindow1();wpfWindow.ShowDialog();// modalの場合// wpfWindow.Show(); // modelessの場合
とすれば、表示されます。しかし、これだけだと、WinFormsについて書いた以前の記事(Modeless FormのZ order)と同じ問題が発生して、WindowがInventorの後ろに隠れうる状態です。
WPFでは、WinFormsの場合と違って、modalでもInventorの後ろに回ります。
解決策は、modelessなWinFormsと同じように親子関係の設定をする必要があり、WPFでは次のようにします。
varwpfWindow=newWindow1();// Window Handleを操作するためのHelpervarhelper=newSystem.Windows.Interop.WindowInteropHelper(wpfWindow);// 親を設定するhelper.Owner=newSystem.IntPtr(InventorApplication.MainFrameHWND);// 表示するwpfWindow.ShowDialog();// modalの場合// wpfWindow.Show(); // modelessの場合