2013-07-25 3 views
1

У меня есть UserControl, созданная половина в VS Designer и половина кода. Я хочу создать новый экземпляр этого UserControl из кода, но каждый раз устанавливаю некоторые его свойства по умолчанию для разных значений.
Пример (редактирование ж реальный код):Свойство Keep Control по умолчанию включено в сериализацию времени разработки

// in my Main Form.. 
var newFrame = new RPictureFrame(); // my UserControl 
newFrame.Width = 50; 
newFrame.Height = 50; 
newFrame.Location = new Point(0,0); 
this.Controls.Add(newFrame); 

newFrame = new RPictureFrame(); 
newFrame.Width = 200; 
newFrame.Height = 400; 
newFrame.Location = new Point(0,150); 
this.Controls.Add(newFrame); 

Оригинал неправильно пример:

var newMyUserControl1 = new MyUserControl(); 
newMyUserControl1.size.Width = 50; 

var newMyUserControl2 = new MyUserControl(); 
newMyUserControl2.size.Width = 200; 

Что иногда случается, хотя это новое значение, установленное мной сразу после создания нового экземпляра управлений кажется чтобы проигнорировать.
Мое единственное объяснение состоит в том, что, поскольку мой UserControl разработан в Designer, все его свойства по умолчанию фактически сериализованы в файле .resx (?). Когда я создаю новый экземпляр во время выполнения, десериализация начинается в отдельном потоке (у меня нет контроля). Когда я устанавливаю некоторые из свойств случайно, прежде чем они получат десериализацию, мое значение сразу же перезаписывается по значению ser'd. Я не нашел никакой информации о том, как работает создание созданных конструктором элементов управления, так что это, конечно, только моя догадка.

Мой вопрос в том, как обойти его? Возможно, какой-то простой способ.

Вещи, я попытался:

1- В моем UserControl код:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
     public Size size; 

..разработать удалить стандартные свойства от Design времени сериализации. Но (компилятор говорит) Я только скрываю существующее стандартное свойство. Плюс это, конечно, не работает. Я все еще новичок в C# & .NET, возможно, я просто делаю это неправильно?

2- Я думаю, что могу подписаться на каждое событие нового события управления (on) Load, позволить ему полностью десериализовать, а затем установить то, что мне нужно. Но это кажется очень громоздким в коде, свойства будут понапрасну получить набор в два раза (или больше) и т.д. В принципе, я не считаю, что это не более элегантное решение :)

Будем рады за любые советы

+0

Вы падают в стандартную ловушку .NET, что каждый программист попадает рано или поздно. Свойство «размер» возвращает * копию * значения. Поскольку Size является типом значения. Присвоение свойства Width позволяет обновлять только копии. Обратите больше внимание на ответ Гленна, он показал правильный способ его установить. –

+0

@ Hans Passant & Glenn Cuevas: Вы оба действительно правы. Тип размера - это структура, и ее значение не может быть изменено так, как я выразился в моем примере выше. - Как я уже писал, мой пример был таким же объяснением и не отображал мой настоящий код. Который я вижу, не является хорошим подходом (отметил в следующий раз :). Я редактировал пример OP, чтобы иметь смысл. - Мой вопрос по-прежнему стоит, поскольку проблема все еще существует, если я правильно назначил свойства элемента управления (в новом примере). То есть значение свойства, которое я установил, не будет палкой. – Riva

+0

Ну, вы выяснили, что это всегда * действительно * плохая идея опубликовать фальшивый код в вопросе SO. Опубликовать реальный код. –

ответ

2

Обновленный Ответ:

Основываясь на новом коде:

newFrame.Width = 50; 
newFrame.Height = 50; 

Изменение, что:

newFrame.Size = new Size(50, 50); 

Вы заметите, что шаблон также используется для местоположения.

Оригинал Ответ:

При изменении размера элемента управления вы должны d новый переменным размере, так как это тип значения.

Ваш код должен быть:

newMyUserControl1.size = new Size(50, newMyUserControl1.size.Height); 

Проверить эту ссылку:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.size.aspx

+0

Мой пример в OP - просто пример, объясняющий мой подход в орехе, а не мой точный код. В любом случае, если вы посмотрите на него, вы увидите, что я не назначаю Size (struct), просто size.Width, int. Итак, если я ничего не пропустил, мой пример на самом деле прав? В любом случае, я боюсь, что ваш ответ не решит мою проблему. – Riva

+0

Если я чего-то не упускаю, у вас есть открытый член, называемый размером, который имеет тип Size. Если вы посмотрите на ссылку, которую я вам дал, у нее есть этот абзац: «Поскольку класс« Размер »является типом значения, он возвращается значением, означающим, что доступ к свойству возвращает копию размера элемента управления. Таким образом, настройка ширины или Свойства высоты для размера, возвращаемого этим свойством, не будут влиять на ширину или высоту элемента управления. Чтобы настроить ширину или высоту элемента управления, вы должны установить свойство «Ширина» или «Высота» элемента управления или установить свойство «Размер» с новым размером. " –

+0

Жаль, что я устал вчера и пропустил вашу мысль. Вы действительно правы. Тип размера - это структура, и ее значение не может быть изменено так, как я выразился в моем примере выше. - Как я уже писал, мой пример был таким же объяснением и не отображал мой настоящий код. Который я вижу, не является хорошим подходом (отметил в следующий раз :). Я редактировал пример OP, чтобы иметь смысл. - Мой вопрос по-прежнему стоит, поскольку проблема все еще существует, если я правильно назначил свойства элемента управления. То есть значение свойства, которое я установил, не будет палкой. – Riva

Смежные вопросы