WPF Double Animation не работает должным образом C # - PullRequest
0 голосов
/ 28 мая 2018

Когда я пытаюсь анимировать только главное окно, оживляется Высота, однако, когда я использую тот же код для анимации своей сетки, он работает нормально. Пожалуйста, помогите мне, так как я новичок в wpf

<Window x:Class="TestingDemo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:TestingDemo"
    mc:Ignorable="d"
    Name="myWindow"
    AllowsTransparency="True"
    WindowStyle="None"
    Background="Blue"
    Title="MainWindow" Height="100" Width="100">
<Grid>
    <TextBlock MouseDown="TextBlock_MouseDown">
        OpenMe
        <TextBlock.Triggers>
            <EventTrigger RoutedEvent="MouseDown">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation
                            Storyboard.TargetName="myWindow"
                            Storyboard.TargetProperty="Height"
                            From="100"
                            To="600"></DoubleAnimation>
                        <DoubleAnimation
                            Storyboard.TargetName="myWindow"
                            Storyboard.TargetProperty="Width"
                            From="100"
                            To="600"></DoubleAnimation>


                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </TextBlock.Triggers>
    </TextBlock>
   </Grid>
</Window>

W

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Вот то, что я делаю для того же, и это работает как шарм:

  <Window.Triggers>
        <EventTrigger RoutedEvent="Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetProperty="Width" From="0" To="yourWidth" Duration="0:0:1" FillBehavior="HoldEnd" AutoReverse="False" />
                    <DoubleAnimation Storyboard.TargetProperty="Height" From="0" To="yourHeight" Duration="0:0:3" FillBehavior="HoldEnd" AutoReverse="False"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
 </Window.Triggers>

    I have hooked it for Window Loaded event but you can change it as you wish but the key is If you want smooth animation then you have to manually push frames in a timer or thread like:

  /// <summary>
    /// 
    /// </summary>
    public static class DispatcherHelper
    {
        /// <summary>
        /// Simulate Application.DoEvents function of <see cref=" System.Windows.Forms.Application"/> class.
        /// </summary>
        [SecurityPermissionAttribute ( SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode )]
        public static void DoEvents ( )
        {
            DispatcherFrame frame = new DispatcherFrame ( );
            Dispatcher.CurrentDispatcher.BeginInvoke ( DispatcherPriority.Background,
                new DispatcherOperationCallback ( ExitFrames ), frame );

            try
            {
                Dispatcher.PushFrame ( frame );
            }
            catch ( InvalidOperationException )
            {
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="f"></param>
        /// <returns></returns>
        private static object ExitFrames ( object frame )
        {
            ( ( DispatcherFrame ) frame ).Continue = false;

            return null;
        }
    }

Пожалуйста, будьте осторожны, так как не рекомендуется толкать кадры вручную, но если вы знаете, что делаете, тогдавышибись!:.)

0 голосов
/ 29 мая 2018

Жаль, что изменение Width и Height на Window разделено и дорого.Width и Height из Window являются свойством зависимости WPF, но они работают встроенным образом.Те же свойства Grid работают в режиме WPF.

Рекомендуется избегать анимации свойств Width и Height Window.Вместо этого, анимация элементов внутреннего каркаса.

Я попробовал этот код ниже, и он работал не гладко:

while (true)
{
    await Task.Delay(10);
    Width += 10;
    Height += 10;
}
...