返回顶部
首页 > 资讯 > 精选 >WPF如何实现在控件上显示Loading等待动画
  • 952
分享到

WPF如何实现在控件上显示Loading等待动画

2023-07-05 16:07:24 952人浏览 独家记忆
摘要

这篇文章主要介绍了WPF如何实现在控件上显示Loading等待动画的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇WPF如何实现在控件上显示Loading等待动画文章都会有所收获,下面我们一起来看看吧。WPF 如

这篇文章主要介绍了WPF如何实现在控件上显示Loading等待动画的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇WPF如何实现在控件上显示Loading等待动画文章都会有所收获,下面我们一起来看看吧。

WPF 如何在控件上显示 Loading 等待动画

  • 框架使用.net40

  • Visual Studio 2022;

  • 使用方式需引入命名空间后设置控件的附加属性 wd:Loading.Isshow="true",即可显示默认等待动画效果如下:

WPF如何实现在控件上显示Loading等待动画

  • 如需自定义 Loading 一定要 先设置 wd:Loading.Child 在设置 IsShow="true" 。

  • 显示不同 Loading 内容需 wd:Loading.Child ={x:Static wd:NORMalLoading.Default} 进行复赋值显示 NormalLoading 效果如下:

GitHub[2]

github xaml[3]

Gitee[4]

Gitee xaml[5]

WPF如何实现在控件上显示Loading等待动画

实现代码

也可以自定义 Loading 动画如下:

自定义控件 CustomLoading 。

public class CustomLoading : Control    {        public static CustomLoading Default = new CustomLoading();        static CustomLoading()        {            DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomLoading),                new FrameworkPropertyMetadata(typeof(CustomLoading)));        }    }

编写 CustomLoading.xaml 代码如下。

<Style TargetType="{x:Type controls:CustomLoading}">        <Setter Property="Width" Value="40" />        <Setter Property="Height" Value="40" />        <Setter Property="Template">            <Setter.Value>                <ControlTemplate TargetType="{x:Type controls:CustomLoading}">                   <!--此处编写自定义的动画逻辑-->                </ControlTemplate>            </Setter.Value>        </Setter>    </Style>

1)创建装饰 AdornerContainer 代码如下:

using System.windows;using System.Windows.Documents;using System.Windows.Media;namespace WPFDevelopers.Utilities{    public class AdornerContainer : Adorner    {        private UIElement _child;        public AdornerContainer(UIElement adornedElement) : base(adornedElement)        {        }        public UIElement Child        {            get => _child;            set            {                if (value == null)                {                    RemoveVisualChild(_child);                    _child = value;                    return;                }                AddVisualChild(value);                _child = value;            }        }        protected override int VisualChildrenCount        {            get            {                return _child != null ? 1 : 0;            }        }        protected override Size ArrangeOverride(Size finalSize)        {            _child?.Arrange(new Rect(finalSize));            return finalSize;        }        protected override Visual GetVisualChild(int index)        {            if (index == 0 && _child != null) return _child;            return base.GetVisualChild(index);        }    }}

2)创建蒙板控件 MaskControl 代码如下:

using System.Windows;using System.Windows.Controls;using System.Windows.Media;namespace WPFDevelopers.Controls{    public class MaskControl : ContentControl    {        private readonly Visual visual;        public static readonly DependencyProperty CornerRadiusProperty =          DependencyProperty.ReGISter("CornerRadius", typeof(CornerRadius), typeof(MaskControl),               new PropertyMetadata(new CornerRadius(0)));        public MaskControl(Visual _visual)        {            visual = _visual;        }        public CornerRadius CornerRadius        {            get => (CornerRadius)GetValue(CornerRadiusProperty);            set => SetValue(CornerRadiusProperty, value);        }    }}

3)创建 Loading 继承 BaseControl 增加附加属性 IsShow 代码如下:

  • True 则动态添加装饰器 AdornerContainer 并将 MaskControl 添加到 AdornerContainer.Child 中。

  • False 则移除装饰器。

using System.Runtime.CompilerServices;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Markup;using System.Windows.Media;using WPFDevelopers.Helpers;using WPFDevelopers.Utilities;namespace WPFDevelopers.Controls{    public class Loading : BaseControl    {        public static readonly DependencyProperty IsShowProperty =           DependencyProperty.RegisterAttached("IsShow", typeof(bool), typeof(Loading),               new PropertyMetadata(false, OnIsLoadinGChanged));        private const short SIZE = 25;        private const double MINSIZE = 40;        private static FrameworkElement oldFrameworkElement;        private static void OnIsLoadingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)        {            if (e.NewValue is bool isMask && d is FrameworkElement parent)            {                if (isMask)                {                    if (!parent.IsLoaded)                        parent.Loaded += Parent_Loaded;                    else                        CreateMask(parent);                }                else                {                    parent.Loaded -= Parent_Loaded;                    CreateMask(parent, true);                }            }        }        private static void Parent_Loaded(object sender, RoutedEventArgs e)        {            if (sender is UIElement element)                CreateMask(element);        }        static void CreateMask(UIElement uIElement, bool isRemove = false)        {            var layer = AdornerLayer.GetAdornerLayer(uIElement);            if (layer == null) return;            if (isRemove && uIElement != null)            {                var adorners = layer.GetAdorners(uIElement);                if (adorners != null)                {                    foreach (var item in adorners)                    {                        if (item is AdornerContainer container)                        {                            var isAddChild = (bool)Loading.GetIsAddChild(uIElement);                            if (!isAddChild)                                Loading.SetChild(uIElement, null);                            container.Child = null;                            layer.Remove(container);                        }                    }                }                return;            }            var adornerContainer = new AdornerContainer(uIElement);            var value = Loading.GetChild(uIElement);            if (value == null)            {                var isLoading = GetIsShow(uIElement);                if (isLoading)                {                    var w = (double)uIElement.GetValue(ActualWidthProperty);                    var h = (double)uIElement.GetValue(ActualHeightProperty);                    var defaultLoading = new DefaultLoading();                    if (w < MINSIZE || h < MINSIZE)                    {                        defaultLoading.Width = SIZE;                        defaultLoading.Height = SIZE;                        defaultLoading.StrokeArray = new DoubleCollection { 10, 100 };                    }                    SetChild(uIElement, defaultLoading);                    value = Loading.GetChild(uIElement);                }                if (value != null)                    adornerContainer.Child = new MaskControl(uIElement) { Content = value, Background = ControlsHelper.Brush };            }            else            {                var normalLoading = (FrameworkElement)value;                var frameworkElement = (FrameworkElement)uIElement;                Loading.SetIsAddChild(uIElement, true);                if (oldFrameworkElement != null)                    value = oldFrameworkElement;                else                {                    string xaml = XamlWriter.Save(normalLoading);                    oldFrameworkElement = (FrameworkElement) XamlReader.Parse(xaml);                }                var _size = frameworkElement.ActualHeight < frameworkElement.ActualWidth ? frameworkElement.ActualHeight : frameworkElement.ActualWidth;                if(_size < MINSIZE)                {                    normalLoading.Width = SIZE;                    normalLoading.Height = SIZE;                    value = normalLoading;                }                                adornerContainer.Child = new MaskControl(uIElement) { Content = value, Background = ControlsHelper.Brush };            }            layer.Add(adornerContainer);        }        public static bool GetIsShow(DependencyObject obj)        {            return (bool)obj.GetValue(IsShowProperty);        }        public static void SetIsShow(DependencyObject obj, bool value)        {            obj.SetValue(IsShowProperty, value);        }    }}

4)创建 DefaultLoading.xaml 代码如下:

<ResourceDictionary xmlns="Http://schemas.microsoft.com/winfx/2006/xaml/presentation"                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"                    xmlns:controls="clr-namespace:WPFDevelopers.Controls">    <ResourceDictionary.MergedDictionaries>        <ResourceDictionary Source="Basic/ControlBasic.xaml"/>    </ResourceDictionary.MergedDictionaries>    <Style TargetType="{x:Type controls:DefaultLoading}">        <Setter Property="Width" Value="40" />        <Setter Property="Height" Value="40" />        <Setter Property="Template">            <Setter.Value>                <ControlTemplate TargetType="{x:Type controls:DefaultLoading}">                    <Viewbox Width="{TemplateBinding Width}"                              Height="{TemplateBinding Height}">                        <controls:SmallPanel>                            <controls:SmallPanel.Resources>                                <Storyboard x:Key="StarStoryboard" RepeatBehavior="Forever">                                    <DoubleAnimation                                                Storyboard.TargetName="PART_Ellipse"                                                Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)"                                                To="360"                                                Duration="0:0:1.0" />                                </Storyboard>                            </controls:SmallPanel.Resources>                            <Ellipse                                        Width="{TemplateBinding Width}"                                        Height="{TemplateBinding Height}"                                        Stroke="{DynamicResource BaseSolidColorBrush}"                                        StrokeDashArray="100,100"                                        StrokeThickness="2" />                            <Ellipse                                        x:Name="PART_Ellipse"                                        Width="{TemplateBinding Width}"                                        Height="{TemplateBinding Height}"                                        Stretch="Uniform"                                        RenderTransformOrigin=".5,.5"                                        Stroke="{DynamicResource PrimaryPressedSolidColorBrush}"                                        StrokeDashArray="{TemplateBinding StrokeArray}"                                        StrokeThickness="2">                                <Ellipse.RenderTransform>                                    <RotateTransform Angle="0" />                                </Ellipse.RenderTransform>                                <Ellipse.Triggers>                                    <EventTrigger RoutedEvent="Loaded">                                        <BeginStoryboard Storyboard="{StaticResource StarStoryboard}" />                                    </EventTrigger>                                </Ellipse.Triggers>                            </Ellipse>                        </controls:SmallPanel>                    </Viewbox>                </ControlTemplate>            </Setter.Value>        </Setter>    </Style></ResourceDictionary>

5)创建 LoadingExample.xaml 实例代码如下:

<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.LoadingExample"             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"              xmlns:wd="https://github.com/WPFDevelopersOrg/WPFDevelopers"             xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"             mc:Ignorable="d"              d:DesignHeight="450" d:DesignWidth="800">        <Grid Margin="10">            <StackPanel Grid.Column="1">                <CheckBox Name="MyCheckBox" Content="启动 Loading 动画"                          VerticalAlignment="Center"                          HorizontalAlignment="Center"/>                <UniformGrid Margin="10" Rows="2" Columns="3">                    <Border Background="Red"                 wd:Loading.IsShow="{Binding ElementName=MyCheckBox,Path=IsChecked}">                        <TextBlock Text="Mask 0"                       VerticalAlignment="Center"                        HorizontalAlignment="Center"/>                    </Border>                    <Image Source="pack://application:,,,/WPFDevelopers.Samples;component/Images/Breathe/0.jpg"                   wd:Loading.IsShow="{Binding ElementName=MyCheckBox,Path=IsChecked}"                           wd:Loading.Child="{x:Static wd:NormalLoading.Default}"/>                    <Button Content="Mask 1" wd:Loading.IsShow="{Binding ElementName=MyCheckBox,Path=IsChecked}" Height="28"                    VerticalAlignment="Top" HorizontalAlignment="Center"/>                    <Button Content="Mask 2" wd:Loading.IsShow="{Binding ElementName=MyCheckBox,Path=IsChecked}"                    VerticalAlignment="Top" HorizontalAlignment="Center" Margin="0,10"/>                    <Button Content="提交" wd:Loading.IsShow="{Binding ElementName=MyCheckBox,Path=IsChecked}"                     VerticalAlignment="Top" HorizontalAlignment="Center" Margin="0,10"                    Style="{StaticResource PrimaryButton}"/>                </UniformGrid>            </StackPanel>        </Grid></UserControl>

效果图

WPF如何实现在控件上显示Loading等待动画

关于“WPF如何实现在控件上显示Loading等待动画”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“WPF如何实现在控件上显示Loading等待动画”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: WPF如何实现在控件上显示Loading等待动画

本文链接: https://lsjlt.com/news/353045.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • WPF如何实现在控件上显示Loading等待动画
    这篇文章主要介绍了WPF如何实现在控件上显示Loading等待动画的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇WPF如何实现在控件上显示Loading等待动画文章都会有所收获,下面我们一起来看看吧。WPF 如...
    99+
    2023-07-05
  • 详解WPF如何在基础控件上显示Loading等待动画
    WPF 如何在基础控件上显示 Loading 等待动画 框架使用.NET4 至 .NET6;Visual Studio 2022;使用方式需引入命名空间后设置控件的附加属性 ...
    99+
    2023-05-15
    WPF基础控件显示Loading等待动画 WPF 控件Loading等待动画 WPF Loading动画
  • WPF实现在控件上显示Loading等待动画的方法详解
    WPF 如何在控件上显示 Loading 等待动画 框架使用.NET40;Visual Studio 2022;使用方式需引入命名空间后设置控件的附加属性 wd:Loadi...
    99+
    2023-03-24
    WPF控件显示Loading等待动画 WPF Loading等待动画 WPF Loading动画
  • css3如何实现搜索等待动画效果
    这篇文章主要介绍css3如何实现搜索等待动画效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!     <html>     ...
    99+
    2024-04-02
  • C#如何使用SplashScreenManager控件实现启动闪屏和等待信息窗口
    这篇文章主要介绍了C#如何使用SplashScreenManager控件实现启动闪屏和等待信息窗口的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#如何使用SplashScreenManager控件实现启动闪屏...
    99+
    2023-06-30
  • CSS3如何实现灯光照射显示文字动画
    这篇文章主要介绍了CSS3如何实现灯光照射显示文字动画,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。<!DOCTYPE html>...
    99+
    2024-04-02
  • jQuery如何实现判断控件是否显示
    这篇文章给大家分享的是有关jQuery如何实现判断控件是否显示的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。核心代码:if($("#elem_id").is(...
    99+
    2024-04-02
  • css3和jquery如何实现动画显示弹出层按钮
    这篇文章主要为大家展示了“css3和jquery如何实现动画显示弹出层按钮”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“css3和jquery如何实现动画显示弹...
    99+
    2024-04-02
  • css如何实现元素显示与隐藏动画效果
    这篇文章主要讲解了“css如何实现元素显示与隐藏动画效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css如何实现元素显示与隐藏动画效果”吧! ...
    99+
    2024-04-02
  • HTML5如何实现上传文件显示进度
    这篇文章主要为大家展示了“HTML5如何实现上传文件显示进度”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“HTML5如何实现上传文件显示进度”这篇文章吧。 这...
    99+
    2024-04-02
  • jQuery如何实现鼠标经过显示动画边框特效
    这篇文章将为大家详细讲解有关jQuery如何实现鼠标经过显示动画边框特效,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。效果图:代码如下:<!DOCTYPE ...
    99+
    2024-04-02
  • 如何在Ubuntu虚拟控制台实现显示中文
    这篇文章主要讲解了“如何在Ubuntu虚拟控制台实现显示中文”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何在Ubuntu虚拟控制台实现显示中文”吧!我从网上下载的是ubuntu serv...
    99+
    2023-06-17
  • 如何实现react显示文件上传进度demo
    这篇文章给大家分享的是有关如何实现react显示文件上传进度demo的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。在...
    99+
    2023-06-14
  • 如何使用css实现图片在页面上以相同等比例显示缩放
    这篇文章给大家分享的是有关如何使用css实现图片在页面上以相同等比例显示缩放的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。   css图片等比例显示具体代码示例如下:   &...
    99+
    2024-04-02
  • AngularJS如何实现根据不同条件显示不同控件
    这篇文章将为大家详细讲解有关AngularJS如何实现根据不同条件显示不同控件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。由于项目需求,需要实现根据不同条件显示不同控件...
    99+
    2024-04-02
  • 发送ajax请求如何实现上传图片显示在网页上
    这篇“发送ajax请求如何实现上传图片显示在网页上”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看...
    99+
    2024-04-02
  • CSS如何实现让文字半透明显示在图片上
    这篇文章将为大家详细讲解有关CSS如何实现让文字半透明显示在图片上,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。代码如下:<!DOCTYPE html PUBLIC...
    99+
    2024-04-02
  • HTML5中Ajax如何实现文件上传并显示进度条
    这篇文章主要介绍HTML5中Ajax如何实现文件上传并显示进度条,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下效果图:html5上传是同步上传的方式,所以能够实现进度条的显示。1.上传文件:首先我们用aj...
    99+
    2023-06-08
  • JavaScript基于Ajax实现不刷新在网页上动态显示文件内容的示例分析
    这篇文章主要介绍JavaScript基于Ajax实现不刷新在网页上动态显示文件内容的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!下面的JS代码是一个最基础的JS的ajax实...
    99+
    2024-04-02
  • SpringMVC如何实现多个文件上传及上传后立即显示图片功能
    这篇文章主要为大家展示了“SpringMVC如何实现多个文件上传及上传后立即显示图片功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringMVC如何实现多个文件上传及上传后立即显示图片功...
    99+
    2023-05-31
    springmvc
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作