在WPF控件上显示"加载"指示器的最佳方法是什么
时间:2020-03-06 14:22:16 来源:igfitidea点击:
在C#.Net WPF中,在UserControl.Load->
在完成收集数据并呈现其内容之前,在UserControl上显示旋转圆圈/"正在加载"指示器的最佳方法是什么?
解决方案
我通常会创建这样的布局:
<Grid> <Grid x:Name="MainContent" IsEnabled="False"> ... </Grid> <Grid x:Name="LoadingIndicatorPanel"> ... </Grid> </Grid>
然后,将数据加载到工作线程上,并在完成后更新" MainContent"网格下的UI并启用该网格,然后将LoadingIndicatorPanel的"可见性"设置为"折叠"。
我不确定这是否是我们要的内容,或者我们是否想知道如何在加载标签中显示动画。如果是我们要播放的动画,请更新问题以更具体。
这是我最近为了创建加载动画所做的工作。这个xaml将产生一个动画的圆环。
我最初的想法是创建一个装饰器,并使用此动画作为其内容,然后在装饰器层中显示加载的动画,并在其下方显示为灰色。
还没有机会完成它,所以我想我只发布动画以供我们参考。
<Window x:Class="WpfApplication2.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300" > <Window.Resources> <Color x:Key="FilledColor" A="255" B="155" R="155" G="155"/> <Color x:Key="UnfilledColor" A="0" B="155" R="155" G="155"/> <Storyboard x:Key="Animation0" FillBehavior="Stop" BeginTime="00:00:00.0" RepeatBehavior="Forever"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="_00" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"> <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/> <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/> </ColorAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="Animation1" BeginTime="00:00:00.2" RepeatBehavior="Forever"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="_01" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"> <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/> <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/> </ColorAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="Animation2" BeginTime="00:00:00.4" RepeatBehavior="Forever"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="_02" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"> <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/> <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/> </ColorAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="Animation3" BeginTime="00:00:00.6" RepeatBehavior="Forever"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="_03" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"> <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/> <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/> </ColorAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="Animation4" BeginTime="00:00:00.8" RepeatBehavior="Forever"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="_04" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"> <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/> <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/> </ColorAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="Animation5" BeginTime="00:00:01.0" RepeatBehavior="Forever"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="_05" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"> <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/> <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/> </ColorAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="Animation6" BeginTime="00:00:01.2" RepeatBehavior="Forever"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="_06" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"> <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/> <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/> </ColorAnimationUsingKeyFrames> </Storyboard> <Storyboard x:Key="Animation7" BeginTime="00:00:01.4" RepeatBehavior="Forever"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="_07" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"> <SplineColorKeyFrame KeyTime="00:00:00.0" Value="{StaticResource FilledColor}"/> <SplineColorKeyFrame KeyTime="00:00:01.6" Value="{StaticResource UnfilledColor}"/> </ColorAnimationUsingKeyFrames> </Storyboard> </Window.Resources> <Window.Triggers> <EventTrigger RoutedEvent="FrameworkElement.Loaded"> <BeginStoryboard Storyboard="{StaticResource Animation0}"/> <BeginStoryboard Storyboard="{StaticResource Animation1}"/> <BeginStoryboard Storyboard="{StaticResource Animation2}"/> <BeginStoryboard Storyboard="{StaticResource Animation3}"/> <BeginStoryboard Storyboard="{StaticResource Animation4}"/> <BeginStoryboard Storyboard="{StaticResource Animation5}"/> <BeginStoryboard Storyboard="{StaticResource Animation6}"/> <BeginStoryboard Storyboard="{StaticResource Animation7}"/> </EventTrigger> </Window.Triggers> <Canvas> <Canvas Canvas.Left="21.75" Canvas.Top="14" Height="81.302" Width="80.197"> <Canvas.Resources> <Style TargetType="Ellipse"> <Setter Property="Width" Value="15"/> <Setter Property="Height" Value="15" /> <Setter Property="Fill" Value="#FFFFFFFF" /> </Style> </Canvas.Resources> <Ellipse x:Name="_00" Canvas.Left="24.75" Canvas.Top="50"/> <Ellipse x:Name="_01" Canvas.Top="36" Canvas.Left="29.5"/> <Ellipse x:Name="_02" Canvas.Left="43.5" Canvas.Top="29.75"/> <Ellipse x:Name="_03" Canvas.Left="57.75" Canvas.Top="35.75"/> <Ellipse x:Name="_04" Canvas.Left="63.5" Canvas.Top="49.75" /> <Ellipse x:Name="_05" Canvas.Left="57.75" Canvas.Top="63.5"/> <Ellipse x:Name="_06" Canvas.Left="43.75" Canvas.Top="68.75"/> <Ellipse x:Name="_07" Canvas.Top="63.25" Canvas.Left="30" /> <Ellipse Stroke="{x:Null}" Width="39.5" Height="39.5" Canvas.Left="31.75" Canvas.Top="37" Fill="{x:Null}"/> </Canvas> </Canvas> </Window>
如果我们在Vista上运行它,则也可以只使用默认的等待光标。
this.Cursor = Cursors.Wait;
使用BusyIndicator。这是一件事。
我们可以显示动画gif作为加载元素
XAML
<WindowsFormsHost> <winForms:PictureBox x:Name="pictureBoxLoading" /> </WindowsFormsHost>
后面的代码
pictureBoxLoading.Image = System.Drawing.Image.FromFile("images/ajax-loader.gif");