C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

WPFアプリの初期フォーカスの位置

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■86442 / inTopicNo.1)  WPFアプリの初期フォーカスの位置
  
□投稿者/ glan (1回)-(2018/01/29(Mon) 17:55:13)

分類:[C#] 

開発環境はVisual studio 2017 WPFアプリ C#です。
WindowにKeyDownイベントを設定し起動した時、指定のキーを押すことにより、KeyDownイベントに設定したプログラムを実行することができます。
しかし、Keyboard.ClearFocus();を行うと、キーボードを入力してもイベントが発生しなくなります。

起動時の初期のフォーカスはどのような扱いになっているのでしょうか?
また、動作させるにはどのように改善すれば良いのでしょうか?

目的はtextboxの入力フォーカスを外したいと考えています。

引用返信 編集キー/
■86443 / inTopicNo.2)  Re[1]: WPFアプリの初期フォーカスの位置
□投稿者/ Hongliang (609回)-(2018/01/29(Mon) 18:17:53)
> 起動時の初期のフォーカスはどのような扱いになっているのでしょうか?
特に指定しない場合、Windowオブジェクトがキーボードフォーカスを持ちます。

> また、動作させるにはどのように改善すれば良いのでしょうか?
なにをどう動作させるのかがよく分かりませんでした。
https://msdn.microsoft.com/ja-jp/library/system.windows.input.keyboard.clearfocus(v=vs.100).aspx
Keyboard.ClearFocus自体は、特殊な用途でのみ使用するメソッドのようです。
// 今初めて存在を知りました。

> 目的はtextboxの入力フォーカスを外したいと考えています。
起動時というわけではなさそうですが。
ユーザの一般的なフォーカス移動操作以外の契機で、TextBoxにキーボードフォーカスがある場合にキーボードフォーカスを他に移したい、ということでしょうか。
キーボードフォーカスを当てたい要素のFocusメソッドを呼び出すのではだめでしょうか?
基本的にキーボードフォーカスはアクティブなウィンドウのどこかに常に存在しているものなので、「外す」という発想はよくない方向かと。
引用返信 編集キー/
■86444 / inTopicNo.3)  Re[2]: WPFアプリの初期フォーカスの位置
□投稿者/ glan (2回)-(2018/01/29(Mon) 18:52:12)
回答有難うございます。

>キーボードフォーカスを当てたい要素のFocusメソッドを呼び出すのではだめでしょうか?
詳しく説明しますと、Grid内の内容を十字キーの左右を押すごとに変更しようとしています。
その為フォーカスを当てたい要素がGrid自体なのですが、.Focus();等でグリッドにフォーカスを与えても、左右キーを押すと他のコントロールにフォーカスが移動してしまうようなのです。
(例えば、タブキーを利用した時に次に当たるフォーカスがコンボボックスなのですが、右キーを一度押すとそちらにフォーカスが移動してしまう)
この挙動が調べてもよく分からなかった為に、起動時に動くのであればそちらにフォーカスを与えることはできないのか、と考えた次第です。

また、Window自体にMain_windowといったNameをつけ、Main_window.focus();というのも試したのですが、こちらも何故かKeyDownイベントを拾うことができませんでした。
引用返信 編集キー/
■86446 / inTopicNo.4)  Re[3]: WPFアプリの初期フォーカスの位置
□投稿者/ Hongliang (610回)-(2018/01/29(Mon) 21:27:58)
> 詳しく説明しますと、Grid内の内容を十字キーの左右を押すごとに変更しようとしています。
> その為フォーカスを当てたい要素がGrid自体なのですが、.Focus();等でグリッドにフォーカスを与えても、左右キーを押すと他のコントロールにフォーカスが移動してしまうようなのです。

Gridは、既定ではフォーカスを取りません。Grid自体にフォーカスを持たせたい場合、FocusableプロパティをTrueに設定する必要があります。
また、既定ではカーソルキーでフォーカスを移動させることが可能になっています。この挙動を変更したい場合、対象の親要素に対して、KeyboardNavigation.DirectionalNavigation添付プロパティを設定します。
引用返信 編集キー/
■86455 / inTopicNo.5)  Re[4]: WPFアプリの初期フォーカスの位置
□投稿者/ namu (5回)-(2018/01/30(Tue) 19:49:29)
No86446 (Hongliang さん) に返信

> Gridは、既定ではフォーカスを取りません。Grid自体にフォーカスを持たせたい場合、FocusableプロパティをTrueに設定する必要があります。
> また、既定ではカーソルキーでフォーカスを移動させることが可能になっています。この挙動を変更したい場合、対象の親要素に対して、KeyboardNavigation.DirectionalNavigation添付プロパティを設定します。

GridにFocusable="Ture"を設定し、親要素にKeyboardNavigation.DirectionalNavigation="None"を設定したのですが、やはり.Focus();をした後に十字キーを入力するとフォーカスが動いてしまいます。
(右キーなら隣のコンボボックスに移動してしまいますし、上キーならMenuItemに移動してしまいます)


引用返信 編集キー/
■86457 / inTopicNo.6)  Re[5]: WPFアプリの初期フォーカスの位置
□投稿者/ namu (6回)-(2018/01/30(Tue) 20:27:29)
Windowではなく、Gridを囲むGridを作成し、そちらにKeyDownやFocusable、KeyboardNavigation.DirectionalNavigation="None"を設定したところ、一応フォーカスが移動しないことが確認できました。

完璧に理解できたわけではないので少しばかり思うところはありますが、現在の書き方が動作としてもコードとしても問題があるわけではないので、こちらの方法を採用することにします。

質問に回答していただいたHongliangさん、有難うございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ