当我尝试对主窗口进行动画处理时,只有高度被动画化,但是当我使用相同的代码对网格进行动画处理时,它工作正常。请帮助我,因为我是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
遗憾的是,更改Window
的Width
和Height
是分离且昂贵的。Window
的Width
和Height
是 WPF 依赖项属性,但它们以本机方式工作。Grid
的相同属性以 WPF 方式工作。
建议避免对Window
的Width
和Height
属性进行动画处理。而是对内部框架元素进行动画处理。
我在下面尝试了这段代码,它工作不顺利:
while (true)
{
await Task.Delay(10);
Width += 10;
Height += 10;
}
这是我正在做的事情,它就像一个魅力:
<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;
}
}
请小心,因为不建议手动推动框架,但如果你知道自己在做什么,那就把自己击倒! :)。