WPF:Loading等待动画、加载动画

本文介绍了如何使用WPF创建四种不同的加载动画,包括旋转圆、弧形滑动、旋转矩形和3D旋转。通过样式和动画结合,利用PowerEase缓动函数实现平滑过渡,为用户界面添加视觉吸引力。这些动画适用于加载指示器,展示了不同的设计和技术实现。

全部效果

在这里插入图片描述

类型1

效果
在这里插入图片描述
思路

1、用8个浅灰色的圆当背景
2、4个渐变深灰色的圆,一直改变其旋转角度,表示Loading的过程

首先,定位下图圆的位置(红色线为辅助线),剩余的直接旋转角度就行。
在这里插入图片描述

画布长宽为100

<Canvas Width="100" Height="100">

圆的半径是25,设计其基础的样式。因为剩余的圆是通过该圆旋转得到的,旋转的中心是上图中几条红色直线相交的那个点,不难算出RenderTransformOrigin0.5,2,这个很关键。

<Style x:Key="ellipse" TargetType="Ellipse">
    <Setter Property="Width" Value="25"/>
    <Setter Property="Height" Value="25"/>
    <Setter Property="RenderTransformOrigin" Value="0.5, 2"/>
    <Setter Property="Fill" Value="#FFAAAAAA"/>
    <Setter Property="Canvas.Left" Value="37.5"/>
    <Setter Property="Canvas.Top" Value="0"/>
</Style>

剩下的就是旋转啦

<!-- 8个背景圆 -->
<Ellipse Style="{ 
       StaticResource ellipse}">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="0"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Style="{ 
       StaticResource ellipse}">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="45"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Style="{ 
       StaticResource ellipse}">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="90"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Style="{ 
       StaticResource ellipse}">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="135"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Style="{ 
       StaticResource ellipse}">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="180"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Style="{ 
       StaticResource ellipse}">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="225"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Style="{ 
       StaticResource ellipse}">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="270"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Style="{ 
       StaticResource ellipse}">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="315"/>
    </Ellipse.RenderTransform>
</Ellipse>
<!-- 4个一直旋转的圆 -->
<Ellipse Name="ell1" Style="{ 
       StaticResource ellipse}" Fill="Black" Opacity="0.3">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="45"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Name="ell2" Style="{ 
       StaticResource ellipse}" Fill="Black" Opacity="0.4">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="90"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Name="ell3" Style="{ 
       StaticResource ellipse}" Fill="Black" Opacity="0.5">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="135"/>
    </Ellipse.RenderTransform>
</Ellipse>
<Ellipse Name="ell4" Style="{ 
       StaticResource ellipse}" Fill="Black" Opacity="0.6">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="180"/>
    </Ellipse.RenderTransform>
</Ellipse>

这样就能得到上图了。

如何旋转圆ell1 ell2 ell3 ell4呢?
这里用了关键帧动画DoubleAnimationUsingKeyFrames改变RotateTransform Angle属性。对于圆ell1,其初始旋转角度是45°,那还需要旋转到90°、135°、180°、225°、270°、315°、360°共7个角度,不难写出动画代码,其他三个类似。

<Storyboard x:Key="sb1" RepeatBehavior="Forever">
     <DoubleAnimationUsingKeyFrames Storyboard.TargetName="ell1" 
         Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)">
         <DiscreteDoubleKeyFrame KeyTime="0:0:0.1" Value="90"/>
         <DiscreteDoubleKeyFrame KeyTime="0:0:0.2" Value="135"/>
         <DiscreteDoubleKeyFrame KeyTime="0:0:0.3" Value="180"/>
         <DiscreteDoubleKeyFrame KeyTime="0:0:0.4" Value="225"/>
         <DiscreteDoubleKeyFrame KeyTime="0:0:0.5" Value="270"/>
         <
### WPF 中实现加载条功能的示例 在 WPF 应用程序中,可以通过多种方法来实现加载条功能。以下是基于提供的引用以及常见的实践方案所总结的内容。 #### ViewModel 的绑定逻辑 通过 `ViewModel` 来控制加载状态是一种常见的方式。以下是一个简单的 `ViewModel` 示例: ```csharp namespace LoadingDemo.ViewModels { using System.ComponentModel; public class MainWindowViewModel : INotifyPropertyChanged { private bool _isLoading; public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public bool IsLoading { get => _isLoading; set { if (_isLoading != value) { _isLoading = value; OnPropertyChanged(nameof(IsLoading)); } } } } } ``` 此部分实现了 `IsLoading` 属性的变化通知机制[^1]。 --- #### XAML 部分:显示加载动画 为了展示加载过程中的视觉效果,可以使用 `ContentControl` 和自定义样式。下面提供了一个完整的例子: ```xml <Window x:Class="LoadingDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WPF 加载条示例" Height="350" Width="525"> <Grid> <!-- 主界面 --> <TextBlock Text="这是主界面内容..." Visibility="{Binding IsLoading, Converter={StaticResource BooleanToVisibilityConverter}, ConverterParameter=Inverted}"/> <!-- 加载动画 --> <StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="{Binding IsLoading, Converter={StaticResource BooleanToVisibilityConverter}}"> <!-- 使用 ProgressBar 控件 --> <ProgressBar IsIndeterminate="True" Width="200" Height="20"/> <!-- 自定义旋转动画 --> <ContentControl RenderTransformOrigin="0.5,0.5"> <ContentControl.RenderTransform> <RotateTransform Angle="0"/> </ContentControl.RenderTransform> <Ellipse Fill="Blue" Width="20" Height="20"/> <ContentControl.Triggers> <EventTrigger RoutedEvent="Loaded"> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)" From="0" To="360" Duration="0:0:2" RepeatBehavior="Forever"/> </Storyboard> </BeginStoryboard> </EventTrigger> </ContentControl.Triggers> </ContentControl> </StackPanel> </Grid> </Window> ``` 上述代码展示了如何结合 `ProgressBar` 和自定义旋转动画来创建动态加载体验[^3]。 --- #### 数据模板 (DataTemplate) 延迟加载 如果需要更复杂的场景支持延迟加载,则可采用数据模板的方式来管理视图切换。例如: ```xml <ContentControl Content="{Binding CurrentView}"> <ContentControl.Resources> <DataTemplate DataType="{x:Type local:AViewModel}"> <local:AView /> </DataTemplate> </ContentControl.Resources> </ContentControl> ``` 这种方式允许根据不同的模型实例自动渲染对应的 UI 组件[^2]。 --- #### 后端逻辑处理 对于异步操作的支持,通常会配合后台线程或者任务调度器完成实际的工作负载。例如,在按钮点击事件触发时启动模拟耗时的任务并更新加载标志位: ```csharp private async void StartTaskButton_Click(object sender, RoutedEventArgs e) { var viewModel = DataContext as MainWindowViewModel; try { viewModel.IsLoading = true; await Task.Delay(3000); // 模拟长时间运行的操作 } finally { viewModel.IsLoading = false; } } ``` 这段代码片段演示了如何通过设置 `IsLoading` 属性来同步前端与后端的状态变化。 ---
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值