2009-05-21 3 views
1

私は、任意の数の子を含むことができるという点でパネルのように機能するWindowsフォームのカスタムコントロールを持っています。子コントロールの数とタイプは実行時に決定されるため、存在する可能性のある子コントロールがないかどうかわからずに一般的な方法で作業する必要があります。子コントロールがWinFormsでフォーカスを取得または紛失したときの追跡方法は?

パネルにフォーカスがあるかどうかによって、パネルの背景色を変更したいと思います。したがって、パネルの子(またはパネルなどの子の子)がフォーカスを取る場合、これを知りたいので、カスタムパネルの背景色を更新できます。フォーカスが子階層にないものに移動すると、元の背景色に戻すことができるように知る必要があります。

Control.ContainsFocusは、パネルに子階層のフォーカスが含まれているかどうかを教えてもらえますが、変更がいつあるかを知る必要があります。現時点では、私は次のような貧弱なメカニズムしか考え出すことができません。

私は各子供の各子供と各子供のGotFocus/LostFocusにフックします。私はControlAdded/ControlRemovedをフックして、可能な変更可能な子供のヒアナリーと同期しておく必要があります。ご覧のとおり、これは多くのイベントフックで終わる可能性があり、より簡単なアプローチが必要だと思われます。何か案は?

答えて

1

私はそれが唯一の選択肢だと思います。 Winformsには時にはAPIにいくつか厄介な穴があります。私はチェックしていませんが、ContainsFocusがコンテナコントロールのコントロールツリーを単に再帰的に探索して、コントロールにフォーカスがあるかどうかを調べるだけであれば、私は驚きません。

多くのイベントハンドラを持つことはそれほど問題ではなく、UI要素を変更する多くのイベントを発生させます。あなたは追加可能なコントロールをサブスクライブすることでこれを回避することができます(ただし、すべてのコントロールまたはサブセットのみを許可する必要があるかどうかはわかりません)。コントロールが追加されたコントロールにパネルを渡して、 /フォーカスを失う。しかし、それはまた多くの作業であり、パネルにコードを表示するオブザーバーのようなパターンは、IMHOで簡単に行うことができます。

6

と入力してください。を入力してください。イベントは答えです。 GotFocusは、フォーカスを取得する特定のコントロールにのみ送信され、Enterイベントは、GotFocusイベントを取得するコントロールの親(および祖先)コントロールにも送信されます。 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.leave.aspx

から

「と入力し、脱退イベントは階層的であり、適切な制御が達成されるまで、親チェーン上下にカスケードと ます。 たとえば、2つのGroupBoxコントロールを持つフォームを持っていると仮定各 GroupBoxコントロールにはTextBoxコントロールが1つあります。キャレットを のTextBoxから別のTextBoxに移動すると、TextBox とGroupBoxのLeaveイベントが発生し、もう1つのGroupBoxと TextBoxのEnterイベントが発生します。 "

関連する問題