В WPF кто-нибудь анимировал сетку?

У меня есть 2 столбца в сетке. Когда я нажимаю кнопку, я хочу, чтобы первый столбец анимировался слева от его текущей позиции до 0. Таким образом, по сути, он сворачивается, и мне остается только просматривать один столбец.

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
21
0
23 025
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Не должно быть слишком сложно. Вам нужно будет создать EventTrigger с BeginStoryboard, который нацелен на сетку и использует DoubleAnimation для уменьшения ширины столбца. Пример здесь имеет аналогичную настройку. EventTrigger будет находиться на кнопке, а StoryBoard.Target DoubleAnimation будет указывать на ColumnDefinition, который вы хотите сжать.

Ладно, это не так хорошо работает. Вы не можете уменьшить столбец напрямую, но вы МОЖЕТЕ установить для столбца сжатия значение заполнения (width = "*"), установить ширину сетки и столбца без сжатия, а затем сжать всю сетку. Это действительно работает. Приведенный ниже пример работает:

<Page xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
      WindowTitle = "Opacity Animation Example" 
      Background = "White">
   <StackPanel Margin = "20">
      <Grid Name = "MyGrid" Width = "200" HorizontalAlignment = "Left">
         <Grid.RowDefinitions>
            <RowDefinition Height = "100"/>
         </Grid.RowDefinitions>
         <Grid.ColumnDefinitions>
            <ColumnDefinition Width = "*"/>
            <ColumnDefinition Width = "100"/>
         </Grid.ColumnDefinitions>
         <Rectangle HorizontalAlignment = "Stretch"  
                    VerticalAlignment = "Stretch" 
                    Grid.Column = "0" Fill = "Red"/>
         <Rectangle HorizontalAlignment = "Stretch"  
                    VerticalAlignment = "Stretch" 
                    Grid.Column = "1" Fill = "Blue"/>
      </Grid>

      <Button Name = "hideButton">
         <Button.Triggers>
            <EventTrigger RoutedEvent = "Button.Click">
               <BeginStoryboard>
                  <Storyboard>
                     <DoubleAnimation 
                         Storyboard.TargetName = "MyGrid"
                         Storyboard.TargetProperty = "(Grid.Width)" 
                         From = "200" To = "100" 
                         Duration = "0:0:2" 
                         AutoReverse = "True"  /> 
                  </Storyboard>
               </BeginStoryboard>
            </EventTrigger>
         </Button.Triggers>
      </Button>
   </StackPanel>
</Page>

Еще вы можете сделать анимацию содержимого и настроить сетку на автоматическое изменение размера содержимого, что будет происходить плавно по мере изменения размера содержимого.

Вы также можете добиться этого с помощью анимации GridLength, см. Пример здесь http://marlongrech.wordpress.com/2007/08/20/gridlength-animation/ Используя этот подход, вы можете управлять любым заданным размером Grid.Column или Grid.Row.

Для вашей особой потребности просто поместите первый столбец с Width = "Auto", а второй с *, анимируйте содержание внутри первого столбца - это поможет.

Вы также можете использовать элемент управления Reveal из трюков Кевина, http://j832.com/bagotricks/

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

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

Ссылка вроде мертвая.

Jan Kratochvil 23.02.2013 21:36

Microsoft решила изменить дизайн многих сайтов, поэтому многие ссылки, указывающие на ценные ресурсы, не работают. Первоначальное название статьи было «Создание пользовательской анимации GridLength - видео клиента Windows», но на данный момент я нигде не могу ее найти.

Nikos Tsokos 25.02.2013 12:52
web.archive.org/web/20120918224252/http://windowsclient.net/‌… in this archive you'll find the video
Raymond Osterbrink 01.04.2016 15:23

Я взял исходный код C# Тодда Миранды и изменил его, чтобы продемонстрировать, как анимировать уменьшение и расширение ширины столбцов DataGrid.

Вот исходный код ...

http://www.pocketpctoolkit.com/WPF/DataGridColumnWidthAnimation.zip

Обычно вы нажимаете CheckBox, и для столбцов DataGrid, для которых установлено значение MinWidth, равное 0, ширина будет уменьшена до нулевой. Щелкните флажок еще раз, столбцы вернутся к исходной ширине.

Этот код WPF также демонстрирует, как создавать анимацию / раскадровку в коде.

Вам необходимо создать класс GridLengthAnimation (код из: http://windowsclient.net/learn/video.aspx?v=70654)

public class GridLengthAnimation : AnimationTimeline
{
    public GridLengthAnimation()
    {
        // no-op
    }

    public GridLength From
    {
        get { return (GridLength)GetValue(FromProperty); }
        set { SetValue(FromProperty, value); }
    }

    public static readonly DependencyProperty FromProperty =
      DependencyProperty.Register("From", typeof(GridLength), typeof(GridLengthAnimation));

    public GridLength To
    {
        get { return (GridLength)GetValue(ToProperty); }
        set { SetValue(ToProperty, value); }
    }

    public static readonly DependencyProperty ToProperty =
        DependencyProperty.Register("To", typeof(GridLength), typeof(GridLengthAnimation));

    public override Type TargetPropertyType
    {
        get { return typeof(GridLength); }
    }

    protected override Freezable CreateInstanceCore()
    {
        return new GridLengthAnimation();
    }

    public override object GetCurrentValue(object defaultOriginValue, object defaultDestinationValue, AnimationClock animationClock)
    {
        double fromValue = this.From.Value;
        double toValue = this.To.Value;

        if (fromValue > toValue)
        {
            return new GridLength((1 - animationClock.CurrentProgress.Value) * (fromValue - toValue) + toValue, this.To.IsStar ? GridUnitType.Star : GridUnitType.Pixel);
        }
        else
        {
            return new GridLength((animationClock.CurrentProgress.Value) * (toValue - fromValue) + fromValue, this.To.IsStar ? GridUnitType.Star : GridUnitType.Pixel);
        }
    }
}

И раскадровка для RowDefinition / ColumnDefinition.

<Window.Resources>
    <Storyboard x:Key = "ColumnAnimation">
        <Animations:GridLengthAnimation
            BeginTime = "0:0:0"
            Duration = "0:0:0.1"
            From = "0*"
            Storyboard.TargetName = "ColumnToAnimate"
            Storyboard.TargetProperty = "Width"
            To = "10*" />
    </Storyboard>

</Window.Resources>

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width = "10*" />
        <ColumnDefinition Width = "Auto" />
        <ColumnDefinition x:Name = "ColumnToAnimate" Width = "0*" />
    </Grid.ColumnDefinitions>
</Grid>

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