Синхронизация анимации WPF с привязкой к данным

#c# #wpf #data-binding #animation #synchronization

#c# #wpf #привязка к данным #Анимация #синхронизация

Вопрос:

У меня есть элемент управления масштабированием из WPF Extensions toolkit, который плавно увеличивает и уменьшает масштаб с помощью анимации, а также плавно перемещает холст. Когда я привязал свои данные к некоторым свойствам элементов управления (таким как Zoom и translateX / translateY), пользовательский интерфейс работает очень медленно, и для обновления требуется время.

Мой вопрос заключается в следующем — Есть ли способ временно отключить привязку, чтобы анимации и переходы происходили плавно, и только после их завершения произойдет моя привязка к данным? Я предполагаю, что есть такой способ, но я не смог выяснить, как…

Спасибо за помощь, ребята!

Код:

 <Controls:ZoomControl Style="{DynamicResource ZoomControlStyle1}" x:Name="zoomControl" Zoom="{Binding MapModel.ZoomFactor, Mode=OneWayToSource}" 
                      TranslateX="{Binding MapModel.CenterXLocation, Mode=OneWayToSource}" TranslateY="{Binding MapModel.CenterYLocation, Mode=OneWayToSource}">
  

Комментарии:

1. Я бы сказал, что вы не получите от этого многого. Привязка в wpf выполняется довольно быстро, и я почти уверен, что это не ваша проблема. Вместо этого я бы сказал, что ваш контент на панели перегружен рендерингом. Или вы делаете что-то еще дорогостоящее при настройке вашей привязанной позиции. Вы устанавливаете только значения, которые вы привязываете, или в фоновом режиме происходит что-то еще?

2. Вы правы в том, что содержимое является тяжелым — это холст, загруженный множеством UIElement объектов. Когда запускается обработчик событий OnPropertyChanged, я запускаю небольшую функцию, которая вычисляет некоторые значения, которые отражены в пользовательском интерфейсе приложения

Ответ №1:

Просто предположение: Используйте одностороннюю привязку, чтобы изменение масштаба или translateX не отражалось обратно на ваш источник привязки.

Комментарии:

1. Спасибо за ответ, но это не помогает. В настоящее время я использую привязку к OneWayToSource (я добавил фрагмент кода для демонстрации), и это все еще медленно

2. @JonathanPerry: Опять наоборот 🙂 Используйте OneWay вместо OneWayToSource .

3. @JonathanPerry: OneWayToSource является ли привязка из источника привязки (вашего элемента управления) к цели привязки (вашему свойству), где значение цели записывается в источник, OneWay означает привязку, где значение записывается из источника в цель. Это означает направление передачи данных. При выборе OneWayToSource каждое изменение translateX записывается обратно в ваше свойство во время анимации.

4. Спасибо за объяснение этого. Итак, я в принципе должен обновлять значение translateX только при наведении курсора мыши, а не во время анимации?

5. @JonathanPerry: У вас может быть привязка к TranlsateX, но она должна быть OneWay такой, чтобы значение не записывалось обратно в ваше свойство во время анимации.