Я работал с WPF всего несколько месяцев, но у меня обширный опыт работы с WinForm, ASP.NET и Flex.Я пытаюсь нарисовать пользовательский элемент управления, который выглядит следующим образом: IMAGE .
Мы используем шаблон MVVM.Когда пользовательский элемент управления загружается впервые, все отображается правильно.Элемент управления состоит из холста.Внутри холста существует радиальная панель, которая будет геометрически размещать добавленные элементы UIE.Круглые узлы втянуты в радиальную панель.Показанные PolyLines нарисованы на холсте.Я получаю конечные точки PolyLine, используя GeneralTransform и вызов UIElement.TransformToVisual.Где UIElement в вызове - это синий узел на радиальной панели, и он трансформируется с помощью радиальной панели.Когда элемент управления загружается в первый раз, все работает правильно.Ошибка не происходит, когда шаблон MVVM сообщает об обновлении чертежа.
Когда я пытаюсь выполнить обновление на основе обновления системы, я подтверждаю, что все мои коллекции содержат правильные данные.Таким образом, шаблон MVVM ведет себя так, как и должен.Однако, когда я пытаюсь нарисовать линии, мой вызов TransformToVisual возвращает точку 0,0 вместо значения, которое он делает во время загрузки.Это приводит к тому, что мои полилинии рисуются в верхнем левом углу элемента управления вместо соединения двух узлов.
Вот порядок операций:
1) При загрузке пользовательского элемента управления будут построены мои коллекции,нарисовать контроль.Эти коллекции создаются локально для пользовательского элемента управления, а данные поступают из основной коллекции информации, которая находится в модели представления.Пользовательский элемент управления сам регистрирует метод обновления в широковещательном сообщении обновления пользовательского интерфейса.
2) Пользователь пытается соединить два синих узла с помощью мастера.Соединитель сохраняется, и сообщение об обновлении интерфейса передается в широковещательном режиме.
3) Пользовательский элемент управления вызывает метод Обновить.Здесь я зацикливаю детей холста и удаляю полилинии.Я также звоню radialPanel.Children.Clear.Затем я выполняю тот же код, который создавал мои коллекции при загрузке.Затем я аннулирую свой пользовательский элемент управления, чтобы вызвать OnRender.Затем OnRender попытается нарисовать полилинии для соединения узлов.Узлы всегда расположены правильно на радиальной панели.
4) Действие соединения линии вызывается из OnRender.В нем я использую GeneralTransform gt = node.TransformToVisual (radialPanel).Этот вызов всегда возвращает 0,0, когда пользовательский элемент управления «обновляется», но всегда работает при первой загрузке элемента управления.
Я вполне уверен, что проблема заключается в том, как обновить пользовательский элемент управления на основе сети.уведомление.Я попытался очистить элементы управления, а затем повторить те же операции загрузки, но все равно не повезло.Я выполнил InvalidateVisual против пользовательского элемента управления и попытался сделать все, что в моем переопределенном OnRender, до сих пор не повезло;0,0 все еще возвращается.
У кого-нибудь есть идеи о том, что может происходить с GeneralTransform?Я зашел в тупик, и любой новый путь помог бы.