0

背景色と子の可視性の一部を変更するために、独自の MouseLeave をリッスンする UserControl があります。可視性を失う必要がある子も、背景色を変更するために独自の MouseLeave をリッスンします。

すべてが機能するシナリオは次のとおりです。

  1. マウスを UserControl に移動します。
  2. マウスを子に移動します。
  3. マウスを Child から UserControl に移動します。

問題のあるシナリオは次のとおりです。

  1. マウスを UserControl に移動します。
  2. マウスを子に移動します。
  3. マウスを Child の外に移動します。UserControl の中ではなく、直接その外側に移動します。

このシナリオは、子が UserControl の一番端にあるため、常に発生します。UserControl の MouseLeave が起動しないだけでなく、Child の MouseLeave も起動しないことに注意してください。

この場合、マウスが実際に領域を離れたかどうかを調べるには、他のコントロールの MouseEnter をリッスンしてから、UserControl と Child に通知する必要がありますが、このソリューションは見苦しく、オブジェクト指向ではないため、本当に避けたいと考えています。 .

また、子は UserControl の一番端に配置する必要があり、移動できません。

誰でも問題のきちんとした解決策を思いつくことができますか?

4

3 に答える 3

6

私のテストでは、これが有効な解決策であることを示しています。カスタム ユーザー コントロールが必要なだけです。

    public class MyPanel : Panel
    {
        protected override void OnControlAdded(ControlEventArgs e)
        {
            e.Control.MouseLeave += DidMouseReallyLeave; 
            base.OnControlAdded(e);
        }
        protected override void OnMouseLeave(EventArgs e)
        {
            DidMouseReallyLeave(this, e);
        }
        private void DidMouseReallyLeave(object sender, EventArgs e)
        {
            if (this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition)))
                return;
            base.OnMouseLeave(e);
        }
    }
于 2012-10-26T22:31:57.513 に答える
1

私は以前に同じ行動を見たことがあります。.NET のバージョンは最新ですか? 最新のサービス パックを使用していることを確認してください。

イベントApplication.AddMessageFilterを見たことがありますか? ここでの回答でそれを使用して、マウスメッセージをキャッチし、よりインテリジェントに処理しました。ここは便利かも。

于 2012-10-26T22:18:06.927 に答える
0

これは、MouseLeaveの動作とは異なります。マウスカーソルがアプリケーションウィンドウ全体を移動した場合でも、MouseLeaveイベントが発生するはずです。

MouseLeaveハンドラーでbaseメソッドを呼び出していないのではないかと思います。

とにかく、MouseEnterで、0.25秒ごとに起動するタイマーを設定し、その中でマウスがまだ制御されているかどうかを確認できます。そうでない場合は、タイマーを強制終了し、コントロールの色を変更します。

于 2012-10-26T21:51:13.440 に答える