#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
такой, чтобы значение не записывалось обратно в ваше свойство во время анимации.