防止在派生类中修改Form.FormBorderStyle

时间:2010-11-12 16:16:37

标签: c# winforms

我需要让基类强制执行:

public class DialogForm : Form 
{
    public DialogForm()
    {
        base.HelpButton = true;//enforce this
        base.MinimizeBox = false;//enforce this
        base.MaximizeBox = false;//enforce this
    }
}

AND 请确保之后没有修改,怎么办呢?

我无法覆盖MinimizeBoxMaximizeBox属性,因为它们不是虚拟的,如果有人DialogForm转换为Form将绕过以下代码:

new public bool MinimizeBox
{
    get { return false; }
    set { base.MinimizeBox = false; }
}

new public bool MaximizeBox
{
    get { return false; }
    set { base.MaximizeBox = false; }
}

由于


此处参考如何解决它(感谢SLacks)

private bool m_inOnStyleChanged = false;
protected override void OnStyleChanged(EventArgs e)
{
    if (!m_inOnStyleChanged)
    {
        m_inOnStyleChanged = true;
        base.OnStyleChanged(e);
        base.HelpButton = true;
        base.MinimizeBox = false;
        base.MaximizeBox = false;
        m_inOnStyleChanged = false;
    }
}

2 个答案:

答案 0 :(得分:1)

您可以覆盖OnStyleChanged并将属性设置为false 属性设置者(间接)调用此方法 请注意,在未来的版本中不一定如此(尽管可能会这样)

您还应该添加

[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisiblity(DesignerSerializationVisiblity.Hidden)]

然而,仅隐藏属性并没有错 您(可能)不应该害怕有人会将您的实例转换为Form并设置它们 你的客户真的是敌对的吗?

答案 1 :(得分:0)

如果您想控制表单是否包含这些按钮,可以使用多种选项。

  1. 使用new关键字隐藏属性,以便查看和使用您的版本(他们仍然可以通过转换为Form来使用旧版本。)

  2. 创建一个包装Form实例的新类,让人们从中派生出来。这需要额外的努力来公开您希望它们能够使用的所有事件和调用,但它可以让您完全控制表格可以做什么和不可以做什么。

  3. 侦听OnStyleChanged事件并确保这些属性不会更改。这依赖于未记录的implmentation细节,因此未来的.NET框架可能不会以这种方式运行。

  4. 允许按钮出现,但尝试控制它们对表单的影响。您可能无法控制派生是显示还是隐藏这些按钮,但您可以控制它们对表单的影响。但是,这有点凌乱。您可以通过覆盖一些较低级别的方法(例如SetBoundsCore)来实现此目的。您还应该查看MaximizedBounds属性和关联的处理程序OnMaximizedBoundsChanged。在最小化Resize事件的结果时,您也应该能够控制它。