5

SplitContainer のフォーカス キューを無効にするにはどうすればよいですか? 少し滑らかに見えるように、OnPaint を使用して自分で描画したいのでお願いします。

私はこれを試しました:

    protected override bool ShowFocusCues
    {
        get
        {
            return false;
        }
    }

そして、これは私のコントロールです:

    public class cSplitContainer : SplitContainer
    {
        private bool IsDragging;

        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
            if (!IsSplitterFixed) IsDragging = true;
            Invalidate();
        }
        protected override void OnMouseUp(MouseEventArgs e)
        {
            base.OnMouseUp(e);
            if (IsDragging)
            {
                IsDragging = false;
                IsSplitterFixed = false;
            }
        }
        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);
            if (IsDragging)
            {
                IsSplitterFixed = true;
                if (e.Button == MouseButtons.Left)
                {
                    if (Orientation == Orientation.Vertical)
                    {
                        if (e.X > 0 && e.X < Width) SplitterDistance = e.X;
                    }
                    else
                    {
                        if (e.Y > 0 && e.Y < Height) SplitterDistance = e.Y;
                    }
                }
                else
                {
                    IsDragging = false;
                    IsSplitterFixed = false;
                }
            }
        }
        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            base.OnPaint(e);
            if (IsDragging)
            {
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(127, 0, 0, 0)), Orientation == Orientation.Horizontal ? new Rectangle(0, SplitterDistance, Width, SplitterWidth) : new Rectangle(SplitterDistance, 0, SplitterWidth, Height));
            }
        }
    }

しかし、うまくいきませんでした。前述の他の方法もいくつか試しましたが、まだフォーカス キューが得られます。

4

5 に答える 5

11

あなたが見ているのは、スライダーを動かすために使用されるフローティングウィンドウほどFocusCueではないと思います。

キーボードアクセスが重要でない場合は、選択不可にしてみてください。

public class MySplit : SplitContainer {

  public MySplit() {
    this.SetStyle(ControlStyles.Selectable, false);
  }

  protected override void OnPaint(PaintEventArgs e) {
    e.Graphics.Clear(Color.Red);
  }
}

これにより、SplitContainerがフォーカスを取得できなくなりますが、マウスは引き続きSplitContainerと対話できます。

于 2012-03-14T18:40:47.277 に答える
4

SplitContainerのコードは次のようになります。

protected override void OnPaint(PaintEventArgs e) {
  base.OnPaint(e);
  if (Focused) {
    DrawFocus(e.Graphics,SplitterRectangle);
  }
}

DrawFocusは仮想ではありません。したがって、それを上書きすることはできません。
フォーカスは仮想です。オーバーライド を呼び出すbase.OnPaint(...)ときに false に設定できるかもしれません。OnPaint

したがって、次のコードを追加できます (動作するかどうかはテストしていません)。

private bool _painting;
public override bool Focused
{
  get { return _painting ? false : base.Focused; }
}

protected override void OnPaint(PaintEventArgs e)
{
  _painting = true;

  try
  {
    base.OnPaint(e);
  }
  finally
  {
    _painting = false;
  }
}

これは、クリーンなソリューションというよりもハックです。

于 2012-03-14T18:49:53.077 に答える
4

私はこの問題をグーグルで調べていましたが、この質問が一番上に出てきました。

Microsoft フォーラムには、正当な理由なくスプリッターを盗むことに焦点を当てた解決策と興味深い議論があります。次のコメントは的を射ています。


あなたが言及したフォーカスの問題は設計によるものですが、必要なパフォーマンスを得るには、次の回避策を使用できます: ....


「設計上」かもしれませんが、あまり良いものではありません。Microsoft の運用アプリケーションで、分割されたペインから一時的にフォーカスを奪うスピッターを見たことがありますか? あなたが提案したコードも追加しました。これにより、スプリッターへのフォーカスが永久に失われることはありませんが、スプリッター操作中にペインが選択を非表示および表示するという事実はまだ好きではありません。

この気が散る選択フラッシュは、ほとんどのプロフェッショナル アプリケーションには存在しません。しばらく修正するのに時間がかからないほど十分に優れていますが、ほとんどの人が本当に望んでいるものではありません. TabStop プロパティを尊重したり、AcceptsFocus プロパティを追加したりした場合、ほとんどの人はこれをオフにしたいと思うでしょう。将来のバージョンでは、このオプションを設計に追加する必要があると思います。

--ブレンダン

于 2013-05-18T17:16:54.573 に答える
2

簡単な解決策:それを受け取ったらすぐに焦点を当ててください!

3つのステップ:

  1. GotFocusのハンドラーを作成しますSplitContainer
  2. フォーカスを。で別のコントロールに転送しAnotherControl.Focus()ます。
  3. TabStopに設定False

それで全部です。醜いフォーカスキューは表示されません。

さて、1つの微妙な点:焦点を当てる他のコントロールはどれですか?それはあなた次第です。タブの順序で最初のコントロールを取得するか、SplitContainerの右側のペインにある左上のフォーカス可能なコントロール(下のASCII図のTextBox)を使用します。完璧な解決策は、フォーカスがあった以前のコントロールですが、残念ながらこれを見つけるのは簡単ではありません。最後のフォーカスでコントロールを見つけますが、左上のフォーカス可能なコントロールは非常に良い応答です。

       left pane            right pane
------------------------------------------------
:                     ::                       :
:                     ::   [TextBox] [Button]  :
:                     ::                       :
:                     ::   [Combobox V]        :
:                     ::                       :
------------------------------------------------
于 2012-07-17T11:29:20.437 に答える
0

これは、 stackoveflowで尋ねられるのと同様の質問であり、1つのソリューションが、paintメソッドをオーバーライドする必要があるshowfocuscuesプロパティをオーバーライドするとともに使用されていると推測されます。

于 2012-03-14T18:34:38.147 に答える