質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

2156閲覧

WPFボタン押下後、WindowsForm自身にフォーカスを移す方法について

add-1914

総合スコア16

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2020/10/27 13:19

編集2020/10/27 13:26

いつもお世話になっております。
現在WindowsForm上に、WPFのコントロールの実装を行っているのですが
Form上のKeyDownイベントの実行ができず困っております。

そこで、簡単なテストプログラムとして、Form上にWindowsフォームのボタン、WPFのボタン(System.Windows.Controls.Button)の2つを設置したものをいくつか作成し、動きを確認しているのですが、WPFのボタンを押下した後はForm上のKeyDownイベントを実行できないことを確認いたしました。

WPFコントロールの操作を行った後も、xamlを利用せずにForm自身にフォーカスを移す方法等ありましたらご教示いただけないでしょうか。
WPFは初心者のためWindowsFormと合わせたときに、考慮すべき内容がまだわかっていないところも多いです。
また、訳あってWPFのxamlファイルは利用できないためコードだけで記載できる内容ですと嬉しいです・・。

###発生している問題・エラーメッセージ
WPFコントロール操作(ソース上ではClick)後、FormのKeyDownイベントが実行できない。

###該当のソースコード

C#

1 /// <summary> 2 /// コンストラクタ 3 /// </summary> 4 public Form1() 5 { 6 InitializeComponent(); 7 } 8 9 /// <summary> 10 /// ロード時 11 /// </summary> 12 /// <param name="sender"></param> 13 /// <param name="e"></param> 14 private void Form1_Load(object sender, EventArgs e) 15 { 16 InitForm(); 17 } 18 19 /// <summary> 20 /// フォーム初期化 21 /// </summary> 22 private void InitForm() 23 { 24 var btnWPF = new System.Windows.Controls.Button(); 25 btnWPF.Content = "WPF(_P)"; 26 btnWPF.Click += BtnWPF_Click; 27 28 var btnWPF2 = new System.Windows.Controls.Button(); 29 btnWPF2.Content = "WPF(_Q)"; 30 btnWPF2.Click += BtnWPF2_Click; 31 32 var btnWPF3 = new System.Windows.Controls.Button(); 33 btnWPF3.Content = "WPF(_R)"; 34 btnWPF3.Click += BtnWPF3_Click; 35 36 this.elementHost1.Child = btnWPF; 37 this.elementHost2.Child = btnWPF2; 38 this.elementHost3.Child = btnWPF3; 39 } 40 41 /// <summary> 42 /// KeyDownイベント 43 /// </summary> 44 /// <param name="sender"></param> 45 /// <param name="e"></param> 46 private void Form1_KeyDown(object sender, KeyEventArgs e) 47 { 48 if (e.KeyCode == Keys.N) 49 { 50 MessageBox.Show("Nが押されました。"); 51 } 52 } 53 54 private void BtnWPF3_Click(object sender, System.Windows.RoutedEventArgs e) 55 { 56 MessageBox.Show("WPF3のボタンです。"); 57 } 58 59 private void BtnWPF2_Click(object sender, System.Windows.RoutedEventArgs e) 60 { 61 MessageBox.Show("WPF2のボタンです。"); 62 } 63 64 private void BtnWPF_Click(object sender, System.Windows.RoutedEventArgs e) 65 { 66 MessageBox.Show("WPFのボタンです。"); 67 } 68 69 private void btnWInform_Click(object sender, EventArgs e) 70 { 71 MessageBox.Show("WindowsFormのボタンです。"); 72 } 73 74 private void btnWinform2_Click(object sender, EventArgs e) 75 { 76 MessageBox.Show("WindowsForm2のボタンです。"); 77 } 78 79 private void btnWinform3_Click(object sender, EventArgs e) 80 { 81 MessageBox.Show("WindowsForm3のボタンです。"); 82 }

テスト時の画面
イメージ説明

###確認したこと
①KeyDownイベントは以下の場合起動可能。
・Form起動時
・WindowsFormのボタンをクリックした場合
・WPFのボタンをクリックしていない、かつWPFボタンをアクセラレータキー(_P)などで
起動した場合

②WPFボタン押下後はKeyDownイベントは実行できない。

###補足情報(言語/FW/ツール等のバージョンなど)
.NetFrameWork 4.5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2020/10/28 09:11

逆に btnWPF.Focusable = false; じゃまずいですかね?
add-1914

2020/10/28 09:51

ご回答ありがとうございます。 勉強になります。 btnWPF.Focusble = falseでやってみましたが、いけました。 フォーカスを最初からあてない方向性で実装することは考えつかなかったです。 各ボタンはEnterキーやTabキーでの移動処理も必要なので、実装時には要検討になると思います。 他の部分にも応用効きそうなのでしっかり覚えておきます。
guest

回答1

0

ベストアンサー

恐らくWPF側のコントロールがキーイベントを処理してるので、
WPFコントロール側のKeyDownイベントハンドラ書いて
共通のメソッドに流してやるとかしてやらないとダメかもしれません。

WinFormsとWPFでKeyEventArgsの内容とキーの定数値が微妙に異なるので、
その辺りを吸収する必要があるでしょうね。

csharp

1 protected override void OnLoad(EventArgs e) 2 { 3 base.OnLoad(e); 4 5 //WPFのButtonコントロールを作成し、ClickとKeyDownイベント追加 6 var wpfButton = new System.Windows.Controls.Button(); 7 wpfButton.Content = "WPF(_P)"; 8 wpfButton.Click += WPFButtonClick; 9 wpfButton.KeyDown += WPFKeyDown; 10 11 //ElementHostコントロールを作成し、フォームに追加 12 var elementHost = new ElementHost(); 13 elementHost.Child = wpfButton; 14 this.Controls.Add(elementHost); 15 } 16 17 protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e) 18 { 19 base.OnKeyDown(e); 20 21 if (e.KeyCode == Keys.N) 22 { 23 MessageBox.Show("Nが押されました。"); 24 } 25 } 26 27 private void WPFKeyDown(object sender, System.Windows.Input.KeyEventArgs e) 28 { 29 if (e.Key == System.Windows.Input.Key.N) 30 { 31 MessageBox.Show("Nが押されました。"); 32 } 33 } 34 35 private void WPFButtonClick(object sender, System.Windows.RoutedEventArgs e) 36 { 37 MessageBox.Show("WPFボタンが押されました"); 38 }

投稿2020/10/28 00:53

編集2020/10/28 01:28
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

add-1914

2020/10/28 09:57

ご回答ありがとうございます。 勉強になります。 現在のフォーカスを確認したところWPFボタン押下後はelementHostにフォーカスが移っていました。 教えていただいた方法で実施したところ期待通りの結果を得ることができました。ありがとうございます。 WindowsFormとWPFでKeyEventArgsの内容とキーの定数値が微妙に異なることは知りませんでした。 WPF側のイベントハンドラも追加して、共通メソッド化するのは他のイベントでも今後応用できそうです。 色々と方法をお聞きすることができ、非常に勉強になったのですが、 他イベントでも応用できる方法を教えてくださったradian様をベストアンサーとさせていただきます。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問