c#窗体控件样式,通过样式更改来移除焦点

本文关键字:样式 焦点 窗体 控件 | 更新日期: 2023-09-27 18:16:30

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

我想禁用有焦点控件周围的虚线矩形,特别是按钮和单选按钮。

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

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);
}

不用说,这似乎不起作用。我不知道我在这里错过了什么。如有任何建议和/或建议,我将不胜感激。

c#窗体控件样式,通过样式更改来移除焦点

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

看起来有两种类型的虚线/点矩形:表示控件被聚焦的矩形,以及表示控件是默认控件的矩形。这两种情况都要求您为控件创建一个自定义类。在我的例子中,感兴趣的控件是一个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;
        }
    }
}

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

这些都可以很好地解决矩形问题,但我仍然不明白为什么最初的代码不起作用