为了账号安全,请及时绑定邮箱和手机立即绑定

WPF 双动画无法正常工作 C#

WPF 双动画无法正常工作 C#

C#
BIG阳 2021-07-03 09:41:32
当我尝试为我的主窗口设置动画时,只有 Height 正在设置动画,但是当我使用相同的代码为我的网格设置动画时,它工作正常。请帮助我,因为我是 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>宽
查看完整描述

2 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

遗憾的是,更改Width和Height的Window分离且昂贵。该Width和Height的Window是WPF依赖属性,但他们在本机的方式工作。的相同属性Grid以 WPF 方式工作。


建议避免为 的Width和Height属性设置动画Window。相反,动画内部框架元素。


我已经尝试过下面的代码,但它运行不流畅:


while (true)

{

    await Task.Delay(10);

    Width += 10;

    Height += 10;

}


查看完整回答
反对 回复 2021-07-10
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

这是我正在做的事情,它就像一个魅力:


  <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;

        }

    }

请小心,因为不建议手动推送帧,但如果您知道自己在做什么,那么请自重!:)。


查看完整回答
反对 回复 2021-07-10
  • 2 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信