65.9K
CodeProject 正在变化。 阅读更多。
Home

WPF 中的进度控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (6投票s)

2009 年 10 月 26 日

CPOL

3分钟阅读

viewsIcon

33358

downloadIcon

814

用于显示任何执行进度的用户控件。

引言

这提供了一个免费的用户控件,用于指示应用程序中任何项目的进度。您可以使用WPF提供的进度条,但这是另一种显示进度的不同方式。

背景

我使用此控件来显示服务器上异步查询的进度。“执行查询”按钮被点击时,此进度环控件开始旋转。如果查询失败,则此控件显示红色,否则在成功的情况下显示绿色。

我还使用此控件来显示大型服务器端处理的进度。因为我在我的两个应用程序中发现它很有用,所以我在这里粘贴了代码,以便您也可以使用它。

这还解释了在XAML中使用EventTriggers和动画。

Using the Code

让我们检查一下XAML。

环形

主环由一个路径构成,该路径有两个渐变色标。一个是深色,另一个是浅色。这是在Expression Blend中创建的,方法是组合两个同心圆,用渐变色填充它们,然后将它们组合成一个路径。很简单!

<Path Stretch="Fill" Stroke="#7F505096" Data="M100,63.5 ... 96.565479,0.5 100,0.5 z" 
	Name="ringPath" RenderTransformOrigin="0.5,0.5">
  <Path.RenderTransform>
    <TransformGroup>
      <ScaleTransform ScaleX="1" ScaleY="1"/>
      <SkewTransform AngleX="0" AngleY="0"/>
      <RotateTransform Angle="0"/>
      <TranslateTransform X="0" Y="0"/>
    </TransformGroup>
  </Path.RenderTransform>
  <Path.Fill>
    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
      <GradientStop x:Name="GradientStop1" Color="Blue" Offset="0"/>
      <GradientStop x:Name="GradientStop2" Color="LightBlue" Offset="1"/>
    </LinearGradientBrush>
  </Path.Fill>
</Path> 

旋转动画

您看到的动画是因为我们将此路径从0旋转到360度,结果渐变颜色也会旋转,视觉上我们看到环的旋转。XAML的`Resources`部分中的`rotateAnimation`具有如下所示的旋转标记

<Storyboard x:Key="rotateAnimation">
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="ringPath" 
	Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)
	[2].(RotateTransform.Angle)" RepeatBehavior="Forever">
        <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
        <SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="360"/>
    </DoubleAnimationUsingKeyFrames>
</Storyboard>

颜色变化动画

对于每个状态,都定义了不同的颜色动画。颜色动画将环的渐变颜色色标更改为相应的颜色。每次状态更改时,都会触发不同的事件触发器。让我们以`ErrorState`动画为例

<Storyboard x:Key="errorStateAnimation">
    <ColorAnimation 
         Storyboard.TargetName="GradientStop1"
         Storyboard.TargetProperty="Color"
         From="White" To="Red" 
         Duration="0:0:0.5"
         BeginTime="0:0:0">
    </ColorAnimation>
    <ColorAnimation 
         Storyboard.TargetName="GradientStop2"
         Storyboard.TargetProperty="Color"
         From="White" To="DarkRed" 
         Duration="0:0:0.5"
         BeginTime="0:0:0" />
</Storyboard>

这将浅色渐变色标更改为浅红色,并将深色渐变色标更改为深红色。当错误事件触发器被触发时,颜色将因此以动画的方式更改为红色阴影。

事件触发器

当每个事件触发器被触发时,它都会启动相应的动画。让我们以执行状态事件为例

<EventTrigger RoutedEvent="local:QueryStatus.ExecutingEvent">
    <BeginStoryboard Storyboard="{StaticResource executingStateAnimation}"/>
    <BeginStoryboard Name="rotateAnimation" 
	Storyboard="{StaticResource rotateAnimation}"/>            
</EventTrigger>

这将启动执行状态动画,该动画将颜色转换为绿色。然后它启动旋转事件,该事件开始旋转环。让我们来看一下成功状态事件

<EventTrigger RoutedEvent="local:QueryStatus.SuccessEvent">
    <StopStoryboard BeginStoryboardName="rotateAnimation"/>
    <BeginStoryboard Storyboard="{StaticResource successStateAnimation}"/>
</EventTrigger>

这(以及所有其他状态事件)将首先停止旋转,并将颜色更改为绿色(表示成功)。

代码后置

它公开了一些`public`方法,可以使用此方法的任何客户端都可以使用这些方法。这些`public`方法将触发相应的事件。我已经附加了同步和异步版本的客户端,以演示在两种模式下使用该控件。请注意,在异步模式下,控件的使用不会改变。只有客户端的代码不同。如果代码无法编译(因为您可能没有.NET SP1),只需修复_AsynchronouosWindow.xaml_客户端代码或将其从项目中排除。我已经附加了示例代码,使用进度条控件非常简单。只需添加命名空间,然后包含它即可。如果您设置`height = width`,则它将是一个完美的圆形旋转圆圈,否则它将是一个旋转的椭圆。尽情享受!

历史

  • 2009年10月26日:初始发布
© . All rights reserved.