#c# #wpf #image #animation #transformation
#c# #wpf #изображение #Анимация #преобразование
Вопрос:
У меня есть простые графические изображения, которые я хотел бы преобразовать при срабатывании событий. Преобразовать означает изменить ширину или переместить его в другое положение.
На данный момент я использую элемент Изображения панели инструментов и анимации с помощью раскадровки, например, DoubleAnimation или ThicknessAnimation.
Однако возникают следующие проблемы:
- изображения мерцают при изменении ширины
- качество изображения варьируется, поддерживает ли WPF векторную графику?
Что касается 1. мой вопрос в том, следует ли использовать другие анимации.
Итак, я попробовал преобразование, смотрите Код :
<Image Height="150" HorizontalAlignment="Left" Margin="12,0,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Source="images/side_view.jpg" Width="1244">
<Image.RenderTransform>
<ScaleTransform x:Name="Minimize" ScaleX="1.0" ScaleY="1.0"/>
</Image.RenderTransform>
</Image>
<Button Content="Next Train" Height="23" HorizontalAlignment="Left" Margin="528,233,0,0" Name="btnNext" VerticalAlignment="Top" Width="75" />
<Grid.Triggers>
<EventTrigger RoutedEvent="Button.Click" SourceName="btnNext">
<BeginStoryboard>
<Storyboard TargetName="Minimize" TargetProperty="ScaleX">
<DoubleAnimation To="0.65" Duration="0:0:2"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
Работает так же, как анимация, которую я применил к ширине и полям. Однако оно все еще мерцает! Есть ли какие-либо разумные объяснения?
Ответ №1:
Если вы анимируете ширину изображения, вы заставляете WPF повторно отображать изображение и каждый раз создавать его из scatch. Оно проходит как через процесс компоновки, так и через процесс рендеринга, из-за чего оно мерцает и работает не так хорошо, как могло бы быть.
Лучшим вариантом здесь является анимация ScaleTransform. Преобразование масштаба выполняется полностью аппаратно через DirectX и поэтому будет чрезвычайно быстрым, оно не будет мерцать, а качество изображения должно оставаться практически неизменным на протяжении всего процесса. (если, конечно, вы существенно не изменяете его размер, в этом случае вы потеряете точность.)
Комментарии:
1. @eldad-katz: Я попробовал ScaleTransform, однако результат тот же — есть идеи?
2. Все должно работать так, как предложено. В коде, который вы ввели, я не вижу ScaleTransform с именем Minimize .. но в любом случае, это должно работать идеально. вы уверены, что все, что вы делаете, это анимируете ScaleTransform?
3. @elad-katz: Вы правы, я вставил неправильные коды вместе. Однако они не так уж сильно отличаются, я отредактировал это. Возможно, с этим уже все в порядке, но это не соответствует моему воображению. Это полный код: pastebin.com/cYx5exFx
4. Я копирую и вставляю его на свой компьютер, и он работает отлично, очень быстро и все такое… либо что-то другое искажает его на вашем компьютере, либо, возможно, вы используете чертовски большое изображение. в любом случае код должен работать очень быстро для вас.