1

担当者の手順:

  1. サンプルの .NET フォーム アプリケーションを作成する
  2. フォームに TextBox を配置する
  3. 関数を TextBox の Enter イベントに接続する

このアプリケーションを実行すると、最初にフォーカスが TextBox に移動したときにControl.Enterイベントが発生します。ただし、別のアプリケーションをクリックしてテスト アプリケーションに戻った場合、イベントは再び発生しません。

したがって、アプリケーション間を移動しても Enter/Leave はトリガーされません

このシナリオで発生する、使用できる別のコントロールレベルのイベントはありますか?

通常、Form.Activatedを使用します。残念ながら、私のコンポーネントはドッキング システムによってホストされており、通知なしでコンポーネントを新しいフォームにドッキング解除できるため、ここでは面倒です。

4

10 に答える 10

3

Enter イベントで何をしようとしていますか?

サンプル プログラムで発生する別のコントロール レベル イベントが見つかりませんが、テスト アプリがフォーカスを取り戻すと、最後にフォーカスを持っていたコントロールにまだフォーカスがあります。

興味深い質問ですが、もう少しコンテキストが必要です。

于 2008-10-01T01:40:27.047 に答える
1

あなたの例を試して、別のウィンドウ、デスクトップなどのコントロールの外側をクリックすると、Got および Lost Focus イベントを発生させることができますが、フォーム内またはコントロールが 1 つしかないコントロールをクリックしようとしている場合は、これらのイベントは、注目すべき唯一のものであるため、発生することはありませんダイナミクスを変更するか、コントロールを過負荷にしない限り、入力も左も行われません。これは発生しません。

于 2008-10-02T20:58:57.393 に答える
0

あなたが抱えている問題は、Enterイベントに直接関係していないように思えますが、「コードとは関係のない」コントロールがある場合は、実際にはコントロールレベルのイベントを見ていません。 。

于 2008-10-01T19:09:59.550 に答える
0

単純なControl.GotFocusを試しましたか?

于 2008-10-01T21:36:17.747 に答える
0

Frye さんの問題は、ユーザーがアプリケーションのどこにいても、キーボード ショートカットが機能することです。これらはグローバル コマンドであり、トップ レベルで処理され、「最後にフォーカスされたグリッド」にルーティングされます。

そのため、グリッド レベルでキーストロークを処理しても役に立ちません。

より具体的には、ユーザーがグリッド A、B、および C を起動するとします。しかし、ユーザーは、私のコードとは関係のない他のコントロール X、Y、および Z も起動します。

ユーザーは A をクリックし、次に C をクリックします。次に、Y をクリックし、次に Z をクリックします。Z にフォーカスして、キーボード ショートカットを押します。この場合、グリッド C は、ユーザーがフォーカスされた最後のグリッドであるため、応答する必要があります。

于 2008-10-01T18:23:37.087 に答える
0

私は明確ではなかったと思います。

私のコントロールはコンテナー アプリケーションに存在します。他のチームによる他の無関係なコントロールも同様です。Visual Studio のようなものだと考えてください。私のコントロールはコード編集タブですが、保留中の変更リストとプロパティ ウィンドウもあり、ソース ファイルと共存していますが、直接は関係ありません。

キーボード ショートカットは、コンテナー アプリケーションによって処理されます。次に、ユーザーがフォーカスしていた最後のコントロールにルーティングする必要があります。

この「LastFocusedGrid」参照を維持することは、Enter イベントで行うことです。

Visual Studio で同様の機能を確認したい場合は、次のようにしてください。

  1. いくつかのソース ファイルを開く
  2. [スタート ページ] タブに移動します。
  3. Ctrl-F を押して、「現在のドキュメント」で文字列を検索します
  4. 検索機能は、検索を実行するために LAST FOCUSED ソース ファイルに自動ナビゲートすることに注意してください。

したがって、ソース ファイルに集中していなくても、ctrl-F コマンドは Visual Studio によって処理され、最後にフォーカスされたソース ファイル タブにルーティングされました。

Ctrl-G で同じことを試してみてください。ソースファイルに直接集中しない限り、機能しません。

私のキーボード コマンドは、ここでは Ctrl-G ではなく Ctrl-F のように機能する必要があります。そのため、キーボード イベントを自分のコントロールに直接キャプチャするだけではありません。

それは物事を明確にするか、悪化させますか?

于 2008-10-01T20:25:00.960 に答える
0

あなたの例では、別のコントロールが必要だと思います。その理由は、最初のコントロール (tabIndex 0) にフォーカスがあるためです。フォーカスを切り替える他のコントロールがない場合、このコントロールは常にフォーカスされているため、入力することはできません。別のアプリケーションまたはフォームに切り替えても、このフォームのフォーカスまたはアクティブなコントロールは変更されないため、戻ったときにイベントが発生することはありません。

コントロールを追加すると、 control.entered は正常に動作するはずです。これが唯一のコントロールである場合、フォームがフォーカスを取得したときに formLoad または TextChanged でイベントを呼び出さないのはなぜですか?

于 2008-10-01T04:12:05.013 に答える
0

ありがとう、私はいくつかの背景を与えます。

私のコントロールは、グリッドとツールバーを含む UserControl です。ユーザーは通常、これらのコントロールのいくつかを起動して、システムのデータのさまざまなスライスを表示します。

現在のグリッドで選択した行からアクションを起動できるキーボード ショートカットがいくつかあります。ただし、これらのキーボード ショートカットは、現在フォーカスされているグリッドだけに適用する必要はありません。ユーザーが現在、アプリケーションの他の多くの領域の 1 つにフォーカスしている場合でも、このキーボード ショートカットは機能し、最後にフォーカスされたグリッドにルーティングされる必要があります。

そこで、UserControl の Control.Enter イベントに関数を配線して、基本的に LastFocusedGrid = this と言います。

そして、ドッキングとドッキング解除を除いて、それは機能します...

これらのコントロールは、ドッキング機能を備えたアプリケーション内でホストされており、Visual Studio に多少似ています。

既定では、Visual Studio でソース ファイルを開く方法と同様に、コントロールはアプリケーションのメイン作業領域内のタブとして起動します。

ただし、ユーザーは、タブ ヘッダーをつかんでメイン アプリケーションからドラッグすることで、タブを「切り取る」ことができます。この時点で、アプリケーションはコントロールをホストする新しい「フロート フォーム」を作成します。メイン アプリケーションとこのフロート フォームとの間の切り替えは、Control.Enter および Form.Activated イベントの目的で、アプリ間の切り替えと同じです。

その時点で、元の投稿で説明されているサンプル アプリケーションでシミュレートされた「フォーム内の 1 つのコントロール」シナリオがあります。

さて、これを回避する方法がいくつかあります。フォームを切り替えるときに発生する Form.Activated イベントを利用できます。テスト アプリケーションのイベントを Form の Activated イベントに追加すると、うまく機能することがわかります。

問題は、私の UserControl とその親 Form との関係が流動的であるため、ソリューションがやや複雑になることです。「this.ParentForm.Activated」に配線してみましたが、問題なく動作しました。問題は、これをいつ呼び出すかです。ドッキング解除/再ドッキングするとどうなりますか? 「previousParentForm」のようなものを含む厄介なコードの束になってしまい、古いフォームからフックを外すことができましたが、親フォームが変更されているときにドッキングシステムが通知しないという問題にまだ直面していました。そのため、そこでも多くの変更を加える必要がありました。

これらの問題は解決できないわけではありませんが、より単純なコントロール レベルの「親フォームがアクティブ化されました」というイベントがあれば、より洗練されたものになります。

かなり長いですが、状況が明確になることを願っています。

于 2008-10-01T15:02:08.710 に答える
0

グリッドを作成するときに、KeyPressed や KeyUp などのイベントを設定できないでしょうか。その場合、すべてのグリッドが同じイベント ハンドラーを利用できます。イベントハンドラーに入って次のようなことを行うようにしてください。

Grid currentGrid = (Grid)sender;

その後、追跡を気にすることなく、送信された任意のグリッドにそのコード ブロックを適用できるはずです。

すべてのイベント ハンドラーが実際に存在するため、実行に必要なすべてのものがアクセス可能である限り、その場所は実際にはミュート ポイントです。

于 2008-10-01T17:50:01.567 に答える
-2

この例では、テキストボックスのクリックを切り替えると、Enter もフォーカスも期待どおりに動作しませんが、代わりに子フォームをクリックすると、両方が期待どおりに動作します。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;

    namespace EnterBrokenExample
    {
        static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                Form Form1 = new Form();
                Form c1 = new Form();
                Form c2 = new Form();

                Form1.IsMdiContainer = true;

                c1.MdiParent = Form1;
                c2.MdiParent = Form1;

                c1.Show();
                c2.Show();

                TextBox tb1 = new TextBox();
                c1.Controls.Add(tb1);
                tb1.Enter += ontbenter;
                tb1.Text = "Some Text";
                tb1.GotFocus += ongotfocus;

                TextBox tb2 = new TextBox();
                c2.Controls.Add(tb2);
                tb2.Enter += ontbenter;
                tb2.Text = "some other text";
                tb2.GotFocus += ongotfocus;

                Application.Run(Form1);
            }
            static void ontbenter(object sender, EventArgs args)
            {
                if (!(sender is TextBox))
                    return;
                TextBox s = (TextBox)sender;
                s.SelectAll();
            }

            static void ongotfocus(object sender, EventArgs args)
            {
                if (!(sender is TextBox))
                    return;
                TextBox s = (TextBox)sender;
                s.SelectAll();
            }
        }
    }
于 2015-08-24T16:35:45.760 に答える