trapemiyaの日記

hatenablogが新しくなったんで新規一転また2019年1月からちょこちょこ書いてます。C#中心のプログラミングに関するお話です。

Windows FormアプリケーションからWPFのWindowを開いた際にTextBoxで半角入力ができない、カーソルが効かない

過去に作成したWindows Formアプリケーションの機能アップをすべく、その部分はWPFで作成してます。
さて、問題にぶつかりました。Windows FormアプリケーションからWPFのWindowを開いた際に、そのWindowのTextBoxではなぜか半角入力を受け付けてくれません。
全角入力は問題なくできます。
いろいろ悩みましたが、答えはググればすぐでしたorz

xamlのテキストボックス(System.Windows.Controls.TextBox)で半角英数が入力できない
https://social.msdn.microsoft.com/Forums/sqlserver/ja-JP/bd20e0f8-777b-4aad-8d87-47f813aef715/xaml123981248612461124731248812508124831246312473systemwindowscontrols?forum=netfxgeneralja

このページで紹介してあるリンク先の以下のページに解決策があります。

Windows Form opening WPF window
https://social.msdn.microsoft.com/Forums/vstudio/en-US/442782b1-00a1-4e2e-9cc6-ae99b6699126/windows-form-opening-wpf-window?forum=wpf

簡単に言えば、WindowをShow()した後に、以下のメソッドを実行するだけで良い。

System.Windows.Threading.Dispatcher.Run();

もしくは上記の代わりに、以下でも良い。

System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(window);
window.Show();

EnableModelessKeyboardInteropを実行するには、 WindowsFormsIntegration.dll を参照設定する必要がある。

(参考)
WPF Window を Windows フォームから起動した場合の落とし穴
https://hilapon.hatenadiary.org/entry/20100618/1276855276


まぁ、WindowsフォームとWPFは仕組みが全く違いますから仕方ないですわねぇ・・・

【追記 2020-03-12】

System.Windows.Threading.Dispatcher.Run();

が、お勧めということが分かった。

System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(window);
window.Show();

だと、この開いた画面からさらに別のWPFの画面を開くと、同様の症状が出てしまう。