如何在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));
}
}
}
但它不起作用。我还尝试了之前提到的其他一些方法,但我仍然得到了焦点线索。
答案 0 :(得分:8)
我认为你所看到的是FocusCue,而不是用于移动滑块的浮动窗口。
如果键盘访问不重要,您可以尝试使其无法选择:
public class MySplit : SplitContainer {
public MySplit() {
this.SetStyle(ControlStyles.Selectable, false);
}
protected override void OnPaint(PaintEventArgs e) {
e.Graphics.Clear(Color.Red);
}
}
这可以防止SplitContainer获得焦点,但您的鼠标仍然可以与它进行交互。
答案 1 :(得分:4)
SplitContainer 的代码如下:
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
if (Focused) {
DrawFocus(e.Graphics,SplitterRectangle);
}
}
DrawFocus 不是虚拟的。所以你无法覆盖它
聚焦是虚拟的。也许您可以在base.OnPaint(...)
覆盖中调用OnPaint
时将其设置为false。
所以你可以添加以下代码(我没有测试它是否有效):
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;
}
}
这更像是一个黑客而不是一个干净的解决方案。
答案 2 :(得分:4)
我正在谷歌搜索这个问题,这个问题出现在最顶层。
有一个解决方案和有趣的讨论on a Microsoft forum regarding the splitter stealing focus for no good reason。以下评论见:
您提到的焦点问题是设计,但为了获得您想要的性能,您可以使用以下解决方法:....
它可能是“按设计”,但它不是一个非常好的。您在任何Microsoft生产应用程序中看到过什么样的spitters甚至暂时将焦点放在他们分裂的窗格上?我还添加了你建议的代码,它确实让我不会永远失去对分割器的关注,但我仍然不喜欢我的窗格隐藏并在分割器操作期间显示它们的选择。
这种分散注意力的选择闪光灯在大多数专业应用中都不存在。它足够好,可能不值得花时间修复一段时间,但不是大多数人真正想要的。如果您尊重TabStop属性或甚至添加了AcceptsFocus属性,大多数人都希望关闭它。我认为您应该在将来的版本中将此选项添加到设计中。
- 布伦丹
答案 3 :(得分:2)
简单解决方案:收到后立即放弃焦点!
三个步骤:
GotFocus
SplitContainer
处理程序
AnotherControl.Focus()
将焦点转移到另一个控件。TabStop
设为False
这就是全部。丑陋的焦点线索从未显示过。
现在,一个微妙之处:关注哪个其他控件?由你决定。只需按Tab键顺序执行第一个控件,或者在SplitContainer的右窗格中使用左上角的可聚焦控件(下面的ASCII图中的TextBox)。完美的解决方案将是之前的焦点控制,但遗憾的是这不容易找到:Find out the control with last focus,但恕我直言,左上方的可聚焦控制是一个非常好的反应。
left pane right pane
------------------------------------------------
: :: :
: :: [TextBox] [Button] :
: :: :
: :: [Combobox V] :
: :: :
------------------------------------------------
答案 4 :(得分:0)
这是一个在stackoveflow上被问到的一个类似的问题。一个解决方案被你使用以及覆盖showfocuscues属性你也需要覆盖paint方法。