Возможность изменить элемент управления исчезает, если не заданы никакие свойства - PullRequest
0 голосов
/ 08 февраля 2010

Я программно добавляю элементы управления на холст, и это просто замечательно ...

var newControlPoint = new ControlPoint() { Width = 10, Height = 10 };
newControlPoint.SetResourceReference(Control.TemplateProperty, "ControlPoint");
SetCanvasPosition(newControlPoint, position.X - (newControlPoint.Width / 2), position.Y - (newControlPoint.Height / 2));
canvas.Children.Add(newControlPoint);
newControlPoint.UpdateLayout();

... но я отклеиваюсь, когда пытаюсь удалить из первой строки параметры проводной ширины и высоты ...

var newControlPoint = new ControlPoint();

... позиционирование холста, кажется, не вступает в силу, и вновь созданный элемент управления заканчивается на {0,0}.

Есть идеи?

1 Ответ

0 голосов
/ 08 февраля 2010

Две проблемы:

  1. Свойства ширины и высоты не будут установлены, потому что вы не установили их явно. Это ActualWidth и ActualHeight, которые вы хотите, которые устанавливаются WPF.
  2. Элементы управления еще не разложены, поэтому ActualWidth и ActualHeight будут равны нулю.

Чтобы обойти проблему, вы можете:

  1. Использовать привязку данных вместо одноразового расчета.
  2. Присоедините логику позиционирования к событию Loaded элемента управления, чтобы оно было позиционировано.
  3. Используйте Dispatcher.BeginInvoke, чтобы запустить логику макета в отдельном сообщении, которое выполняется с более низким приоритетом по отношению к макету, что гарантирует вычисление и назначение ActualWidth и ActualHeight.
...