WPF加载启动画面
介绍 在MSN messenger的最后一个版本中,当你登录到你的帐户时,你可以注意到简单的动画文本加载。我尝试做一些类似的东西,使应用程序加载看起来专业。 一步一步 创建启动窗口 向WPF应用程序添加一个新窗口。你可以叫它Splashwindow,使窗口无边框和最顶端,你需要添加一些属性,如下所示,添加到XAML在窗口标签或使用属性面板。 隐藏,复制Code
WindowStyle="None" WindowStartupLocation="CenterScreen" ResizeMode="NoResize" ShowInTaskbar="False" Topmost="True"
改变背景 默认情况下,新窗口内容包含一个网格。我们可以改变网格背景使用线性渐变画笔添加以下代码: 隐藏,复制Code
<Grid.Background> <LinearGradientBrushEndPoint="0.5,1"StartPoint="0.5,0"> <GradientStopColor="#FFB9BBFF"Offset="0"/> <GradientStopColor="White"Offset="1"/> <GradientStopColor="White"Offset="0.72"/> </LinearGradientBrush> </Grid.Background>
它会是这样的: 添加不透明蒙版 要产生淡入效果,我们需要创建第二个网格,用不透明遮罩覆盖窗口的下半部分。会导致衰落效应时,文本从边界网格的中心,将透明面具的上下部分第二网格,并将文本添加到网格显示加载信息,显示的顺序从中间用新的文本然后搬到隐藏。 下面的XAML代码创建带有文本框的掩码网格: 隐藏,复制Code
<GridVerticalAlignment="Bottom"HorizontalAlignment="Stretch"Height="150"Background="#00FFFFFF"> <Grid.OpacityMask> <LinearGradientBrushEndPoint="0.5,1"StartPoint="0.5,0"> <GradientStopColor="#00000000"Offset="0.283"/> <GradientStopColor="#00000000"Offset="0.778"/> <GradientStopColor="White"Offset="0.491"/> </LinearGradientBrush> </Grid.OpacityMask> <TextBlockx:Name="txtLoading"TextAlignment="Left"FontSize="16"FontWeight="Normal"Foreground="#FF052045"Text="Beta 0.9"TextWrapping="Wrap"VerticalAlignment="Bottom"HorizontalAlignment="Right"Width="421"> <TextBlock.Effect> <DropShadowEffectBlurRadius="6"Color="#FF797979"Direction="201"Opacity="0.68"ShadowDepth="3"/> </TextBlock.Effect> </TextBlock> </Grid>
网格背景值=#00FFFFFF是完全透明的。我们不需要显示网格,但没有背景,遮罩将不会工作。您可以注意到,在前面的XAML中,textblock具有阴影效果。 在设计视图中,它看起来是这样的: 创建动画 在WPF中,你可以定义动画。你不需要自己写。在Microsoft Blend中,只需要添加一个新的故事板,定义关键帧,并像Flash一样做出改变,但是WPF会为动画生成一个可读的格式。动画将在窗口资源标签中定义并通过键访问。下面的代码显示了两个故事板,每个故事板都有一个1秒的持续时间,只是改变textblock的底部边缘,根据不透明度掩码从隐藏区域移动到可见区域,反之亦然。 隐藏,复制Code
<Window.Resources> <Storyboardx:Key="showStoryBoard"> <ThicknessAnimationUsingKeyFramesStoryboard.TargetProperty= "(FrameworkElement.Margin)"Storyboard.TargetName="txtLoading"> <EasingThicknessKeyFrameKeyTime="0:0:0"Value="0,0,0,0"/> <EasingThicknessKeyFrameKeyTime="0:0:1"Value="0,0,0,70"/> </ThicknessAnimationUsingKeyFrames> </Storyboard> <Storyboardx:Key="HideStoryBoard"> <ThicknessAnimationUsingKeyFramesStoryboard.TargetProperty= "(FrameworkElement.Margin)"Storyboard.TargetName="txtLoading"> <EasingThicknessKeyFrameKeyTime="0:0:0"Value="0,0,0,70"/> <EasingThicknessKeyFrameKeyTime="0:0:1"Value="0,0,0,150"/> </ThicknessAnimationUsingKeyFrames> </Storyboard> </Window.Resources>
使用后面的代码 现在我们已经创建了XAML中需要的内容。在后面的代码中,我们将创建一个线程来做加载工作,并使动画到文本,首先我们需要访问动画,定义两个故事板对象来访问窗口资源故事板。 隐藏,复制Code
Storyboard Showboard; Storyboard Hideboard;
在InitializeComponent()调用之后,通过以下代码访问窗口资源: 隐藏,复制Code
Showboard = this.Resources["showStoryBoard"] as Storyboard; Hideboard = this.Resources["HideStoryBoard"] as Storyboard;
创建两个函数-一个显示文本,一个隐藏如下: 隐藏,复制Code
private void showText(string txt) { txtLoading.Text = txt; BeginStoryboard(Showboard); } private void hideText() { BeginStoryboard(Hideboard); }
我们需要为每个函数创建委托,以使调用形式的加载头如下: 隐藏,复制Code
private void load() { Thread.Sleep(1000); this.Dispatcher.Invoke(showDelegate, "first data to loading"); Thread.Sleep(2000); //do some loading work this.Dispatcher.Invoke(hideDelegate); Thread.Sleep(2000); this.Dispatcher.Invoke(showDelegate, "second data loading"); Thread.Sleep(2000); //do some loading work this.Dispatcher.Invoke(hideDelegate); Thread.Sleep(2000); this.Dispatcher.Invoke(showDelegate, "last data loading"); Thread.Sleep(2000); //do some loading work this.Dispatcher.Invoke(hideDelegate); //close the window Thread.Sleep(2000); this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)delegate() { Close(); }); }
显示闪 有许多方式来显示闪屏,但最简单的方式,我认为只是添加以下在InitializeComponent在主窗口: 隐藏,复制Code
new SplashWindow().ShowDialog();
我希望这对你们有用。 的兴趣点 主要的一点是使用不透明掩模和访问故事板背后的形式代码,以及WPF中动画的力量。 历史 2010年10月10日:初任 本文转载于:http://www.diyabc.com/frontweb/news12007.html