【问题标题】:WPF Double Animation Not working Properly C#WPF双重动画无法正常工作C#
【发布时间】:2018-05-28 16:16:50
【问题描述】:

当我尝试为我的主窗口设置动画时,只有 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>

W

【问题讨论】:

    标签: c# .net wpf doubleanimation


    【解决方案1】:

    很遗憾,更改WindowWidthHeight 是分开且昂贵的。 WindowWidthHeight 是 WPF 依赖属性,但它们以本机方式工作。 Grid 的相同属性以 WPF 方式工作。

    建议避免为WindowWidthHeight 属性设置动画。而是为内部框架元素设置动画。

    我在下面尝试了这段代码,但运行不顺利:

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

    【讨论】:

      【解决方案2】:

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

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

      请小心,因为不建议手动推送框架,但如果您知道自己在做什么,那就把自己搞砸! :)。

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 2011-06-29
        • 2021-06-11
        • 1970-01-01
        • 2012-03-03
        • 2017-08-06
        相关资源
        最近更新 更多