У меня есть 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, позволить ему полностью десериализовать, а затем установить то, что мне нужно. Но это кажется очень громоздким в коде, свойства будут понапрасну получить набор в два раза (или больше) и т.д. В принципе, я не считаю, что это не более элегантное решение :)
Будем рады за любые советы
Вы падают в стандартную ловушку .NET, что каждый программист попадает рано или поздно. Свойство «размер» возвращает * копию * значения. Поскольку Size является типом значения. Присвоение свойства Width позволяет обновлять только копии. Обратите больше внимание на ответ Гленна, он показал правильный способ его установить. –
@ Hans Passant & Glenn Cuevas: Вы оба действительно правы. Тип размера - это структура, и ее значение не может быть изменено так, как я выразился в моем примере выше. - Как я уже писал, мой пример был таким же объяснением и не отображал мой настоящий код. Который я вижу, не является хорошим подходом (отметил в следующий раз :). Я редактировал пример OP, чтобы иметь смысл. - Мой вопрос по-прежнему стоит, поскольку проблема все еще существует, если я правильно назначил свойства элемента управления (в новом примере). То есть значение свойства, которое я установил, не будет палкой. – Riva
Ну, вы выяснили, что это всегда * действительно * плохая идея опубликовать фальшивый код в вопросе SO. Опубликовать реальный код. –