Неправильный собственный контроль WPF - PullRequest
2 голосов
/ 20 декабря 2011

У меня есть пользовательский элемент управления WPF, который я сделал пару дней назад:

 public class MapContext : FrameworkElement{
     //....
      protected override void OnRender(DrawingContext dc) {
         // Draw the map
         if (mapDrawing != null) dc.DrawDrawing(mapDrawing);
 }

Чертеж mapDrawing обновляется в другом потоке, где вычисляются все отображаемые геометрии, затем поток обновляет пользовательский интерфейс, вызывая InvalidateVisual():

Application.Current.Dispatcher.Invoke(DispatcherPriority.Render, new Action(delegate { InvalidateVisual(); }));

Вкл. InvalidateVisual, Документация MSDN говорит:

Делает недействительной визуализацию элемента и запускает новый проход макета. OnRender вызывается после завершения цикла макета.

Это не то поведение, которое мне нужно, поскольку макет элемента управления MapContext не изменился. Только рисунок внутри изменился.

Вопрос Есть ли правильный способ заставить метод OnRender вызываться без выполнения полного прохода макета?

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011

Нет, невозможно выполнить повторный рендеринг без прохода макета.Поскольку WPF использует систему с сохранением режима, OnRender () не работает, как в старые времена WinAPI.OnRender () просто хранит коллекцию инструкций для рисования, а WPF определяет, как и когда выполнять фактический рендеринг.

Если вам нужно независимо изменить размер элемента управления, я бы предложил вам использовать что-токак DrawingVisual и с помощью RenderOpen (), чтобы добавить карту mapDrawing, когда вы хотите, чтобы она изменилась.

1 голос
/ 20 декабря 2011

Может быть, вместо того, чтобы использовать свой собственный элемент управления, вы можете нарисовать изображение с вашей картой и установить это изображение в качестве источника для стандартного элемента управления?Такие операции, как рисование, обычно занимают некоторое время, поэтому лучше подготовить изображение в фоновом режиме, а затем переключить его с отображаемым в данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...