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

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

ただいまの
回答率

90.34%

  • C#

    7702questions

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

  • Visual Studio

    2002questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Windows

    1536questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • WPF

    736questions

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

[C#]フォーカスがついているコントローラーを取得したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 392

yyokii

score 25

 前提

・C#
・Visual Studio 2017
・WPFアプリ

 やりたいこと

UIとして「テキストボックス」と「ボタン」があります。

テキストボックスのフォーカス状態を「LostFocus」ハンドラーで監視しており、
フォーカスが外れた際に、フォーカスの移り先を取得したいです。

イメージとしては下記のようなコードを書きたいです。

private void TextBox_LostFocus(object sender, RoutedEventArgs e)
        {
           if ({あるボタンにフォーカスが移ったとき})
            {
                Console.WriteLine("ボタンにフォーカスが移りました。");
            }
            else
            {
                Console.WriteLine("ボタン以外にフォーカスが移りました。");
            }
        }

TextBox_LostFocusにてテキストボックスからフォーカスが外れたイベント取得できているのですが、フォーカスが移ったコントローラーの取得方法が分からないです。

アドバイス等頂けると幸いです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

英語ですがありました。
FocusManager クラスを使えばよさそうです。

Get currently focused element/control in a WPF window

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/09 21:43 編集

    質問と回答を再検討していて、同じサイト(Stackoverflow)の内容を読んでました。こちらの案の方が良いと思います。回答に追記しようとしましたが、それはやめて、こちらへのフォローとさせていただきます。以下はLostFocusハンドラ内で現在、フォーカスを持っている要素を判定している例です。(検証用にコードを書いてしまったので放出)
    private void TextBox_LostFocus(object sender, RoutedEventArgs e)
    {
    Debug.WriteLine("TextBox_LostFocus");

    IInputElement element = FocusManager.GetFocusedElement(this);
    Debug.WriteLine("Type: " + element.GetType().ToString());
    if (element.GetType() == typeof(Button)) {
    // Button
    var button = (Button)element;
    Debug.WriteLine("Button.Name: " + button.Name);
    }
    }

    キャンセル

  • 2018/05/09 21:54 編集

    if (element.GetType() == typeof(Button))
    var button = (Button)element;

    の部分ですが、

    if(element is Button button)



    var button = element as Button;
    if(button!=null)

    の方がスマートですよ。前者は新しい構文なので、環境によってはコンパイルできないかもしれません。

    キャンセル

  • 2018/05/09 21:55

    なるほど、愚直に昔の書き方をしていました。ご指摘どうもありがとうございます。

    キャンセル

+2

LostFocusイベントに対応する、GotFocusイベントがあります。
Visual Studioで、TextBoxのプロパティウィンドウからもGotFocusイベントハンドラを登録できます。

UIElement.GotFocus イベント

その他、参考情報として。フォーカスの概要
※機械翻訳なのでとても読みにくいです。オリジナルの英語サイトの情報の方が良いかも。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/09 21:11

    > ※機械翻訳なのでとても読みにくいです。
    まだ、マシな方ではないでしょうか? 最近、困っています。

    キャンセル

  • 2018/05/09 21:45

    gaya-Kさんの回答案の方が良いかと思いました。(私の案は質問内の要望を満たしてません)

    キャンセル

  • 2018/05/09 22:03

    日本語にして欲しい、、、英語だとどうしてもワンアクション。

    キャンセル

  • 2018/05/09 22:11

    良質な日本語訳を待っていると遅くなってしまうのは、もう仕方が無いかと。(IT系翻訳者さんからローカライズ事情をかなり昔から聞いてますが、人間での供給は限界のようです)

    キャンセル

同じタグがついた質問を見る

  • C#

    7702questions

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

  • Visual Studio

    2002questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Windows

    1536questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • WPF

    736questions

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