1

現在、複数のフォームとダイアログを持つアプリケーションに取り組んでいます。機能の一部は、リボン上の一連のカット、コピー、およびペースト ボタンです。これまでのところ、カット コピー アンド ペースト操作を処理するコードを書くことができませんでした。私の問題は次のとおりです。

メイン フォームの Application.Idle イベントで、現在アクティブなフォーム (メイン フォーム、mdi 子、またはダイアログである可能性があります) に関係なく、現在アクティブなコントロールを把握しようとしています。多くの試行錯誤の後、エラー、これは私の最も成功した試みです:

Form activeForm = Form.ActiveForm;
Control activeControl = activeForm.ActiveControl;

これはほとんどの状況でうまく機能しますが、コントロールがコンテナー (フローティング ドックパネルなど) に埋め込まれている場合、activeControl 変数はコンテナー コントロールを返しますが、フォーカスがあるテキスト ボックスは返しません。

ここで何か不足していますか?この機能を実装するより良い方法はありますか?

ありがとう、ニック

4

1 に答える 1

0

いくつかのコントロールを含むフォームでこれを試してみたところ、GroupBox期待どおりに機能しました (ただし、製品コードでは、何も選択されていない場合、またはアプリにまったくフォーカスがない場合に備えて、おそらくいくつかの null チェックを追加する必要があります):

Form activeForm = Form.ActiveForm;
Control activeControl = activeForm.ActiveControl;
while (activeControl.HasChildren)
{
    activeControl = activeControl
        .Controls
        .Cast<Control>()
        .FirstOrDefault(c => c.Focused);
}

一方、サードパーティのドッキング ライブラリを使用している場合 (DockPanel について言及したので、たとえば、 Weifen Luo の DockPanel Suiteを考えています)、独自のプロパティ (DockPanel.ActiveDocumentまたは などDockPanel.ActiveContent) を使用して取得する必要があります。ドッキングされた形式ですが、一般的な考え方は同じままです。

于 2013-09-06T11:00:19.000 に答える