WPF加载启动画面

main.jpg 介绍 在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>

它会是这样的: intial.jpg 添加不透明蒙版 要产生淡入效果,我们需要创建第二个网格,用不透明遮罩覆盖窗口的下半部分。会导致衰落效应时,文本从边界网格的中心,将透明面具的上下部分第二网格,并将文本添加到网格显示加载信息,显示的顺序从中间用新的文本然后搬到隐藏。 下面的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具有阴影效果。 在设计视图中,它看起来是这样的: masked.jpg 创建动画 在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

posted @ 2020-08-11 08:33  Dincat  阅读(1671)  评论(0编辑  收藏  举报