首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TabStop和专注于GroupBox

TabStop和专注于GroupBox
EN

Stack Overflow用户
提问于 2013-07-11 00:27:54
回答 1查看 1.7K关注 0票数 2

我已经创建了一个扩展GroupBox的自定义控件。此控件支持折叠和展开,我使用GroupBoxRenderer和ButtonRenderer使其看起来像一个在角落中有按钮的典型GroupBox。我已经处理了所有适当的鼠标事件,这有效地使“按钮”的行为和看起来像一个常规按钮。现在,我遇到了一个问题,即GroupBox无法使用TabStop接收焦点。不管怎样,我是否可以让我的可移植GroupBox从TabStop中获得焦点?

我希望我可以利用How to set focus to a control after validation in .NET的技巧在Enter事件中设置焦点,但我还没有想出一个很好的方法来确定何时才能真正获得焦点。我可能会想出一种方法来找到TabIndex最高和最低的兄弟姐妹(或者ChildIndex,如果是同一个TabIndex),然后确定他们是否失去了注意力,但如果我不完全正确的话,这似乎有点麻烦,而且很有可能被打破。

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

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

以下是展开时的样子:

现在,当它已经倒塌(并且有焦点)时:

EN

回答 1

Stack Overflow用户

发布于 2015-03-06 22:27:18

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

代码语言:javascript
复制
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();
    }
}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17583155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档