Запретить изменения в Form.FormBorderStyle в производном классе - PullRequest
0 голосов
/ 12 ноября 2010

Мне нужно сделать так, чтобы базовый класс применял это:

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

И убедитесь, что он не был изменен впоследствии, как это можно сделать?

Я не могу переопределить свойства MinimizeBox и MaximizeBox, поскольку они не являются виртуальными, если кто-то произнесет 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 ]

1 голос
/ 12 ноября 2010

Вы можете переопределить OnStyleChanged и установить свойства на false.
Этот метод вызывается (косвенно) установщиками свойств.
Обратите внимание, что это не обязательно будет верно в будущих версиях (хотя, вероятно, будет)

Вы также должны добавить

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

Однако нет ничего плохого в том, чтобы просто скрыть свойства.
Вы (вероятно) не должны бояться, что кто-то снизит ваш экземпляр до Form и установит его.
Ваши клиенты на самом деле враждебны?

0 голосов
/ 12 ноября 2010

Существует несколько доступных опций, если вы хотите контролировать, есть ли в вашей форме эти кнопки или нет.

  1. Скройте свойства с помощью ключевого слова new, чтобы ваши версии были просмотрены и использованы (они все равно могли использовать старые, приведя к Form).

  2. Создайте новый класс, который обёртывает экземпляр Form, и люди получают его из этого. Это потребует дополнительных усилий для раскрытия всех событий и вызовов, которые вы хотите, чтобы они могли использовать, но это дало бы вам полный контроль над тем, что можно и что нельзя делать с формой.

  3. Прослушайте событие OnStyleChanged и убедитесь, что эти свойства не изменились. Это основано на недокументированных деталях имплментации, поэтому возможно, что будущие .NET-платформы могут вести себя не так.

  4. Позвольте кнопкам появляться, но попробуйте контролировать их эффекты в вашей форме. Возможно, вы не сможете контролировать отображение или скрытие этих кнопок деривацией, но сможете контролировать влияние, которое они оказывают на вашу форму. Тем не менее, это несколько грязно. Вы можете достичь этого, переопределив некоторые методы более низкого уровня, такие как SetBoundsCore. Вам также следует обратить внимание на свойство MaximizedBounds и связанный с ним обработчик OnMaximizedBoundsChanged. Чтобы свести к минимуму результаты в событии Resize, вы также сможете контролировать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...