Что заставляет мою анимацию мерцать - PullRequest
1 голос
/ 20 февраля 2012

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

<Border  BorderBrush="YellowGreen" CornerRadius="8" BorderThickness="10" Background="Black">
        <Grid MouseLeftButtonDown="DragWindow">
            <Grid.Resources>
                    <Style TargetType="Frame" x:Key="GrowingFrameStyle">
                        <Setter Property="Foreground" Value="#505050"/>
                        <Setter Property="Background" Value="Black" />
                        <Setter Property="Height" Value="20" />
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Trigger.EnterActions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <ColorAnimation Duration="0:0:0.5" Storyboard.TargetProperty="Foreground.Color" To="LightGray" />
                                            <ColorAnimation Duration="0:0:0.5" Storyboard.TargetProperty="Background.Color" To="SteelBlue" />
                                            <DoubleAnimation Storyboard.TargetProperty="Height" From="20" To="50" Duration="0:0:.3" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </Trigger.EnterActions>
                                <Trigger.ExitActions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <ColorAnimation Duration="0:0:0.5" Storyboard.TargetProperty="Foreground.Color" To="#505050" />
                                            <ColorAnimation Duration="0:0:0.5" Storyboard.TargetProperty="Background.Color" To="Black" />
                                            <DoubleAnimation Storyboard.TargetProperty="Height" From="50" To="20" Duration="0:0:.3" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </Trigger.ExitActions>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
            </Grid.Resources>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="50"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="20"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Label Grid.Row="1" Grid.ColumnSpan="2" Background="Black"/>
            <Frame Grid.RowSpan="2" Grid.ColumnSpan="2" Background="SlateBlue" VerticalAlignment="Top" Style="{StaticResource GrowingFrameStyle}"/>        
        </Grid>
    </Border>

Единственный метод в коде

private void DragWindow(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
  DragMove();
}

1 Ответ

1 голос
/ 20 февраля 2012

Это вызвано нажатием на расширенную область Frame.

Кажется, что событие MouseUp запускает событие MouseLeave / MouseEnter. MouseLeave запускает анимацию для сжатия кадра, что ставит в очередь событие «Сжатие раскадровки», а MouseEnter ставит в очередь анимацию для расширения кадра, которое ставит в очередь событие «Расширить раскадровку». Сжимая / расширяя фрейм, MouseEnter / MouseLeave снова запускаются, и анимации снова запускаются. Эти двое продолжают бесконечно стрелять, пока вы не переместите мышь из магической области, которая занята только когда рамка расширена.

Вы можете просмотреть задержку в замедленном режиме, добавив BeginTime="00:00:02" к своим раскадровкам, чтобы добавить 2-секундную задержку, и вы можете проверить события MouseEnter / MouseLeave, добавив метод, который записывает строку в вывод в событиях MouseEnter / MouseLeave кадра.

Что касается исправления, я не уверен, что лучший способ сделать это. Возможно, попробуйте использовать события MouseEnter / MouseLeave для ручного запуска событий после 1-секундной задержки, при условии, что событие все еще должно обрабатываться.

Например, если событие MouseUp вызывает события MouseLeave и MouseEnter, то MouseLeave должно поставить в очередь анимацию свертывания, но задержать секунду и проверить, действительно ли мышь находится над объектом на секунду позже. , Если нет, отмените событие сброса. Это может привести к тому, что событие MouseLeave не запустит свою анимацию, что означает, что оно не будет бесконечно помещать анимацию в очередь, пока мышь не будет перемещена из области расширенного фрейма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...