Как лучше всего сдвинуть панель в WPF?

У меня есть довольно простой UserControl, который я сделал (простите за Xaml, я только изучаю WPF), и я хочу убрать его с экрана. Для этого я анимирую преобразование translate (я также пробовал сделать Panel дочерним элементом холста и анимировать положение X с теми же результатами), но панель движется очень рывками, даже на довольно быстром новом компьютере. Как лучше всего скользить внутрь и наружу (желательно с помощью KeySplines, чтобы он двигался по инерции) без рывков. У меня на панели всего 8 кнопок, поэтому я не думал, что это будет большой проблемой.

Вот Xaml, который я использую, он отлично работает в Kaxaml, но он очень резкий и медленный (а также рывковый и медленный при запуске, скомпилированном в приложении WPF).

  <UserControl xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" Width = "1002" Height = "578">
     <UserControl.Resources>            
        <Style TargetType = "Button">
           <Setter Property = "Control.Padding" Value = "4"/>
           <Setter Property = "Control.Margin" Value = "10"/>
           <Setter Property = "Control.Template">
              <Setter.Value>
                 <ControlTemplate TargetType = "Button">
                    <Grid Name = "backgroundGrid" Width = "210" Height = "210" Background = "#00FFFFFF">
                       <Grid.BitmapEffect>
                          <BitmapEffectGroup>
                             <DropShadowBitmapEffect x:Name = "buttonDropShadow" ShadowDepth = "2"/>
                             <OuterGlowBitmapEffect x:Name = "buttonGlow" GlowColor = "#A0FEDF00" GlowSize = "0"/>
                          </BitmapEffectGroup>
                       </Grid.BitmapEffect>
                       <Border x:Name = "background" Margin = "1,1,1,1" CornerRadius = "15">
                          <Border.Background>
                             <LinearGradientBrush StartPoint = "0,0" EndPoint = "0,1">
                                <LinearGradientBrush.GradientStops>
                                   <GradientStop Offset = "0" Color = "#FF0062B6"/>
                                   <GradientStop Offset = "1" Color = "#FF0089FE"/>
                                </LinearGradientBrush.GradientStops>
                             </LinearGradientBrush>
                          </Border.Background>
                       </Border>
                       <Border Margin = "1,1,1,0" BorderBrush = "#FF000000" BorderThickness = "1.5" CornerRadius = "15"/>
                       <ContentPresenter HorizontalAlignment = "Center" Margin = "{TemplateBinding Control.Padding}" 
                        VerticalAlignment = "Center" Content = "{TemplateBinding ContentControl.Content}" 
                        ContentTemplate = "{TemplateBinding ContentControl.ContentTemplate}"/>
                    </Grid>
                 </ControlTemplate>
              </Setter.Value>
           </Setter>
        </Style>
     </UserControl.Resources>
     <Canvas>
        <Grid x:Name = "Panel1" Height = "578" Canvas.Left = "0" Canvas.Top = "0">
           <Grid.RenderTransform>
              <TransformGroup>
                 <TranslateTransform x:Name = "panelTranslate" X = "0" Y = "0"/>
              </TransformGroup>
           </Grid.RenderTransform>
           <Grid.RowDefinitions>
              <RowDefinition Height = "287"/>
              <RowDefinition Height = "287"/>
           </Grid.RowDefinitions>
           <Grid.ColumnDefinitions>
              <ColumnDefinition x:Name = "Panel1Col1"/>
              <ColumnDefinition x:Name = "Panel1Col2"/>
              <ColumnDefinition x:Name = "Panel1Col3"/>
              <ColumnDefinition x:Name = "Panel1Col4"/>
     <!-- Set width to 0 to hide a column-->
           </Grid.ColumnDefinitions>
           <Button x:Name = "Panel1Product1" Grid.Column = "0" Grid.Row = "0" HorizontalAlignment = "Center" VerticalAlignment = "Center">
              <Button.Triggers>
                 <EventTrigger RoutedEvent = "Button.Click" SourceName = "Panel1Product1">
                    <EventTrigger.Actions>
                       <BeginStoryboard>
                          <Storyboard>
                             <DoubleAnimation BeginTime = "00:00:00.6" Duration = "0:0:3" From = "0" Storyboard.TargetName = "panelTranslate" Storyboard.TargetProperty = "X" To = "-1000"/>
                          </Storyboard>
                       </BeginStoryboard>
                    </EventTrigger.Actions>
                 </EventTrigger>
              </Button.Triggers>
           </Button>
           <Button x:Name = "Panel1Product2" Grid.Column = "0" Grid.Row = "1" HorizontalAlignment = "Center" VerticalAlignment = "Center"/>
           <Button x:Name = "Panel1Product3" Grid.Column = "1" Grid.Row = "0" HorizontalAlignment = "Center" VerticalAlignment = "Center"/>
           <Button x:Name = "Panel1Product4" Grid.Column = "1" Grid.Row = "1" HorizontalAlignment = "Center" VerticalAlignment = "Center"/>
           <Button x:Name = "Panel1Product5" Grid.Column = "2" Grid.Row = "0" HorizontalAlignment = "Center" VerticalAlignment = "Center"/>
           <Button x:Name = "Panel1Product6" Grid.Column = "2" Grid.Row = "1" HorizontalAlignment = "Center" VerticalAlignment = "Center"/>
           <Button x:Name = "Panel1Product7" Grid.Column = "3" Grid.Row = "0" HorizontalAlignment = "Center" VerticalAlignment = "Center"/>
           <Button x:Name = "Panel1Product8" Grid.Column = "3" Grid.Row = "1" HorizontalAlignment = "Center" VerticalAlignment = "Center"/>
        </Grid>
     </Canvas>
  </UserControl>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
0
31 436
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы достаточно долго работаете с анимацией WPF, вы поймете, что элементы управления с большой площадью на самом деле перемещаются так, как вы называете «рывками». У меня была эта проблема даже с крошечными кнопками, которые нужно было перемещать по экрану по горизонтали, и я определенно отказался от перемещения чего-либо большого (например, окна).

Я обнаружил, что производительность анимации WPF значительно улучшается, когда не используются BitmapEffect. Попробуйте отключить их в своем примере. Я заменил тени на полупрозрачные сплошные области с градиентной заливкой и улучшил производительность.

Я также слышал, что некоторые эффекты растровых изображений увеличили производительность в новых версиях (может быть, 3.5 SP1?), Поскольку большая часть рендеринга была перенесена на оборудование.

Ответ принят как подходящий

Похоже, что пока лучшее решение - использовать визуальную кисть и перемещать два статических изображения при перемещении по панелям и обратно. Нечто подобное описано в этом сообщении блога:

Использование анимированных страниц навигации в приложении WPF (переключено на веб-архив, но это с 2008 года, поэтому не обещаю, если это все еще лучший метод).

Привет, указанная ссылка не работает: Ошибка 404 - не найдено

Junior Mayhé 05.10.2009 23:38

Работал у меня. Переходит в JAPF - Архив блога: «Использование анимированных страниц навигации в приложении WPF»

Padu Merloti 14.01.2010 23:47

@PaduMerloti Ссылка была исправлена ​​после публикации комментария Джуниора. Включение соответствующего фрагмента кода / объяснения в ответ было бы гораздо более постоянным противодействием гниению ссылок.

Asad Saeeduddin 29.01.2014 02:55

Ссылка теперь пытается отобразить, но бесполезна из-за фатальной ошибки в ее PHP-коде.

ToolmakerSteve 14.03.2019 11:47

Другие вопросы по теме