2014-10-08 4 views
1

Я создаю некоторые пользовательские элементы управления, которые наследуют от базового пользовательского элемента управления, который имеет следующие свойства:Настройка свойств

public Color BorderColor 
    { 
     get { return BorderColor; } 
     set 
     { 
      if (!FollowsScheme) 
       BorderColor = value; 
     } 
    } 

    public Color[] FillColors 
    { 
     get { return FillColors; } 
     set 
     { 
      if (!FollowsScheme) 
       FillColors = value; 
     } 
    } 

    public bool FollowsScheme { get; set; } 

Я пытаюсь сделать так, если пользователь устанавливает FollowsScheme ложь, только тогда могут ли они редактировать свойства BorderColor и FillColors. Если FollowsScheme истинно, то они не могут редактировать два свойства. В этом коде вы можете увидеть, что я пытался сделать, и думал, что это сработает, но когда я построю решение и добавлю элемент управления в форму, Visual Studio выйдет из строя. Как мне это сделать?

Позвольте мне лучше объяснить, если для параметра FollowsScheme установлено значение true, в методе OnPaint код будет рисовать элемент управления на основе свойств BorderColor и FillColors, который основан на статическом классе, заполненном цветами для темы, которую я разработал. Если для параметра FollowsScheme установлено значение false, то метод OnPaint будет использовать свойства BorderColor и FillColors и рассчитать новую схему и установить эти цвета для перечисленных частных свойств, а затем они будут использованы для рисования элемента управления.

ответ

3

Поймите, что при добавлении элемента управления в вашу форму Visual Studio запустит код, необходимый для визуализации этого элемента управления, чтобы он отображался в дизайнере.

Ваш код генерирует StackOverflowException, который впоследствии приводит к сбою Visual Studio.

Это исключение возбуждается, потому что ваш установщик свойств является бесконечно рекурсивным. Решение состоит в том, чтобы ввести поле backng, чтобы сохранить значение следующим образом:

private Color borderColor; 
public Color BorderColor 
{ 
    get { return this.borderColor; } 
    set 
    { 
     if (!FollowsScheme) 
      this.borderColor = value; 
    } 
} 
+0

Huhhh, я всегда видел поля заднего вида для свойств в исходниках, и я никогда не понимал, что это то, для чего оно предназначено! Спасибо! – Minato

+0

@Minato Все хорошие люди. Обратите внимание, что вам нужно ввести поле поддержки для * обоих * свойств. Пожалуйста, учтите, что этот ответ считается принятым, если он адекватно отвечает на ваш вопрос. –

+0

Да, я действительно ждал, пока мне не разрешат ответить, и я потерял след. Еще раз спасибо. – Minato

0

Вы устанавливаете свойство внутри собственности сеттера

public Color BorderColor 
{ 
    get { return BorderColor; } 
    set 
    { 
     if (!FollowsScheme) 
      BorderColor = value; // BOOM! 
    } 
} 

вам необходимо использовать переменную-член поддержку для ваших свойств, как правило, так:

private Color borderColor; 
public Color BorderColor 
{ 
    get { return borderColor; } 
    set 
    { 
     if (!FollowsScheme) 
      borderColor = value; 
    } 
} 
Смежные вопросы