2016-02-13 3 views
0

В основном я создаю свою собственную формуC# замок "Form.BackColor

public class CryForm : System.Windows.Forms.Form 

по нескольким причинам, одна из которых является очень специфический стиль.

Поэтому я хочу, чтобы Form.BackColor свойство быть заблокировано в черный, так что она не может быть изменен с «снаружи»

CryForm1.BackColor = Color.whatevercolorulike 

не должно быть возможно больше.

Есть ли способ достичь этого или я должен придумать совершенно другое решение?

+0

Могу ли я спросить, почему вы не работаете с WPF? ИМО является более гибким и динамичным, чем winforms. С WPF вы можете ограничить значения зависимыми свойствами на 'Window's с принуждением. – Default

+0

@Default нет конкретной причины ^^ –

ответ

2

Если нужно, чтобы «замок» цвет фона формы во время разработки, возможно, наиболее эффективным и наименее подверженным ошибкам решением было бы переопределить свойство BackColor и пометить его атрибутом, а затем наследовать от формы в дизайнере.

Вы могли бы заявить:

public class FixedBackgroundForm : Form 
{ 
    protected new static readonly Color DefaultBackColor = Color.Black; 

    [Browsable(false), 
     DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
    public override Color BackColor 
    { 
     get { return base.BackColor; } 
     set { base.BackColor = value; } 
    } 

    public FixedBackgroundForm() 
    { 
     this.BackColor = DefaultBackColor 
    } 
} 

Какой бы как установить цвет фона формы для Black автоматически, и предотвратить изменение цвета фона внутри дизайнера.

При добавлении новых форм в проект, унаследован от FixedBackgroundForm:

public partial class Form1 : FixedBackgroundForm 
{ 
    ... 
} 

Если вам нужно, чтобы «исправить» цвет фона черного независимо от того, что, просто использовать эту линию для BackColor сеттера :

set { base.BackColor = DefaultBackColor; } 
0

Просто добавьте

public new Color BackColor 
{ 
    get { return Color.Black; } 
} 

в код!

+0

Это не остановит код, просто сделав 'Control control = cryForm; control.BackColor = Color.Red; 'Но вы можете использовать' override' вместо 'new', я думаю (а также переопределить setter). –

+0

nope, попробовал это раньше, не работал. override также работает только на mathods, поэтому .... –

+1

@SaculRennorb Вы пытались переопределить сеттер, используя 'override'? 'override', безусловно, работает как с виртуальными свойствами, так и с методами. –

4

Это должно работать, хотя при попытке установить свойство вы не получите ошибку времени компиляции.

public override Color BackColor 
{ 
    get { return Color.Black; } 
    set { } 
} 

Вы можете сделать это явно, что изменение BackColor не поддерживается. Это приведет к исключению во время выполнения, если что-то пытается изменить его:

public override Color BackColor 
{ 
    get { return Color.Black; } 
    set { throw new NotSupportedException("CryForm doesn't support changing the BackColor"); } 
} 
+0

почти просто отсутствует автоматическая дефолт цвета, но вы правы –

1

Другой вариант, чтобы добавить это событие загрузки формы:

this.BackColorChanged += (s, e2) => 
{ 
    if (this.BackColor != Color.Black) 
     this.BackColor = Color.Black; 
}; 
+0

Это не работает потому что метод изменения формы backcolor, вероятно, возникает после загрузки формы. – Maertin

+0

@Maertin не могли бы вы объяснить свои рассуждения? Это событие, которое запускает каждый раз, когда изменения цвета backcolor, особенно после загрузки формы. – Default

+0

@Default метод может работать, но я не думаю, что событие form.load - это правильное место для его размещения. Событие form.load должно вызываться для вызываемого метода. – Maertin