C#窗体控制样式,通过样式更改删除焦点

时间:2011-12-02 00:21:50

标签: c# winforms styles controls

我有一个从父表单加载的子表单。父表单不是MDI父表单。 我想做以下事情:

我想在具有焦点的控件周围禁用虚线/虚线矩形,尤其是Buttons和RadioButtons。

目前我正在使用以下代码:

foreach (System.Windows.Forms.Control control in this.Controls)
{
    // Prevent button(s) and RadioButtons getting focus
    if (control is Button | control is RadioButton)
    {
        HelperFunctions.SetStyle(control, ControlStyles.Selectable, false);
    }
}

我的SetStyle方法是

public static void SetStyle(System.Windows.Forms.Control control, ControlStyles styles,
    bool newValue)
{
    // .. set control styles for the form
    object[] args = { styles, newValue };

    typeof(System.Windows.Forms.Control).InvokeMember("SetStyle",
        BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod,
        null, control, args);
}

毋庸置疑,这似乎不起作用。我不确定我在这里缺少什么。任何建议和/或建议将不胜感激。

1 个答案:

答案 0 :(得分:2)

嗯,我想我找到了一种解决方案。解决方案解决了焦点矩形问题,但没有回答发布的原始代码有什么问题。这是我对矩形问题的理解....如果我有任何错误,请随时纠正我。

看起来有两种类型的虚线/点状矩形:指示控件聚焦的矩形,以及指示控件是默认控件的矩形。这两种情况都要求您为控件创建自定义类在我的情况下,感兴趣的控件是RadioButton。所以这是代码:

public class NoFocusRadioButton: RadioButton
{
    // ---> If you DO NOT want to allow focus to the control, and want to get rid of
    // the default focus rectangle around the control, use the following ...

    // ... constructor
    public NoFocusRadioButton()
    {
        // ... removes the focus rectangle surrounding active/focused radio buttons
       this.SetStyle(ControlStyles.Selectable, false);
    }
}

或使用以下内容:

public class NoFocusRadioButton: RadioButton
{
    // ---> If you DO want to allow focus to the control, and want to get rid of the
    // default focus rectangle around the control, use the following ...

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

我使用第一种(构造函数代码)方法不允许输入焦点。

这一切都很适合解决矩形问题,但我仍然不明白为什么初始代码不起作用。