gpt4 book ai didi

c# - TabStop 和 Focus on GroupBox

转载 作者:太空宇宙 更新时间:2023-11-03 16:10:39 24 4
gpt4 key购买 nike

我创建了一个扩展 GroupBox 的自定义控件。此控件支持折叠和展开,我使用 GroupBoxRenderer 和 ButtonRenderer 使其看起来像一个典型的 GroupBox,在角落里有一个按钮。我已经处理了所有适当的鼠标事件,这些事件有效地使“按钮”的行为和外观像一个普通的按钮。现在我遇到了一个问题,即 GroupBox 没有使用 TabStop 获得焦点。无论如何,我可以让我的 Collapsable GroupBox 从 TabStop 接收焦点吗?

我希望我可以使用 How to set focus to a control after validation in .NET 中的技巧在 Enter 事件中设置焦点,但我还没有想出一个好方法来确定它何时应该真正获得焦点。我可能会想出一种方法来找到具有下一个最高和最低 TabIndex 的 sibling (如果 TabIndex 相同,则为 ChildIndex),然后确定他们是否失去了焦点,但这似乎有点老套,如果我没有得到,很有可能会崩溃完全正确。

注意:我最初确实创建了用户控件,但由于各种原因这不是我想要的,包括:

  1. 它不是一个包含按钮和组框的控件(它恰好看起来像那样),它是一个组框
  2. 灵 active
  3. 后端代码和UI之间的耦合
  4. 动态布局
  5. 在许多需要工具箱支持和自定义整个控件的 UI 和布局的项目中共享

这是展开后的样子: enter image description here

现在当它被折叠(并且有焦点)时: enter image description here

最佳答案

CheckGroup => 这是自定义控件的一种方法,它继承自控件并在 OnPaint 方法中使用 GroupBoxRenderer 和 CheckBoxRenderer。它是一个容器,通过更改 CheckBoxRenderer 的绘制方式来模拟获得焦点。此代码折叠 CheckGroup 并禁用所有子控件,但您可以根据需要删除其中一个或两个。

using System;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
namespace CoolControls
{

[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(System.ComponentModel.Design.IDesigner))]
public partial class CheckGroup : Control
{
public event EventHandler CheckBoxGotFocus;
public event EventHandler CheckBoxLostFocus;

private int _CheckBoxSideLength;
private Rectangle _CheckBoxBorderRectangle;
private bool _Focused = false;
private bool _Checked;
private CheckBoxState _CheckedState = CheckBoxState.UncheckedNormal;
private int _ExpandedHeight;

[Category("Behavior")]
[Description("Get or set whether the checkbox is checked.")]
public bool Checked
{
get { return _Checked; }
set
{
SetCheckedState(value);
}
}

public CheckGroup()
{
InitializeComponent();
InitControl();
}

private void InitControl()
{
_CheckBoxSideLength = 15;
_Checked = true;
_Focused = false;
_CheckBoxBorderRectangle = new Rectangle(0, 0, _CheckBoxSideLength - 1, _CheckBoxSideLength - 1);
}

private void SetCheckedState(bool pToChecked)
{
_Checked = pToChecked;
if (_Checked)
{
_CheckedState = CheckBoxState.CheckedNormal;
this.Height = _ExpandedHeight;
}
else
{
_CheckedState = CheckBoxState.UncheckedNormal;
this.Height = _CheckBoxSideLength;
}
foreach (Control c in this.Controls)
{
c.Enabled = _Checked;
}
this.Invalidate();
}

protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
Graphics g = pe.Graphics;
GroupBoxRenderer.DrawGroupBox(g, ClientRectangle, " " + this.Text, this.Font, this.ForeColor, TextFormatFlags.Left, GroupBoxState.Normal);
CheckBoxRenderer.DrawCheckBox(g, ClientRectangle.Location, _CheckBoxBorderRectangle, "", null, TextFormatFlags.Left, _Focused, _CheckedState);
}

protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
if (_Checked)
{
_ExpandedHeight = this.Size.Height;
}
}

protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
if (e.Location.Y <= _CheckBoxSideLength)
{
SetCheckedState(!_Checked);
}
}

protected override void OnGotFocus(EventArgs e)
{
base.OnGotFocus(e);
_Focused = true;
Invalidate();
CheckBoxGotFocus.Invoke(this, new EventArgs());
}

protected override void OnLostFocus(EventArgs e)
{
base.OnLostFocus(e);
_Focused = false;
Invalidate();
CheckBoxLostFocus.Invoke(this, new EventArgs());
}

protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
if (e.KeyCode == Keys.Space)
{
SetCheckedState(!_Checked);
}
}

protected override void OnResize(EventArgs e)
{
base.OnResize(e);
Invalidate();
}
}
}

关于c# - TabStop 和 Focus on GroupBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17583155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com