老板加薪!看我做的WPF Loading!!!
控件名:RingLoading
作者:WPFDevelopersOrg
框架使用大于等于.NET40;
Visual Studio 2022;
项目使用 MIT 开源许可协议;
老板觉得公司系统等待动画转圈太简单,所以需要做一个稍微好看点的,就有这篇等待RingLoading动画;

Grid -> Ellipse 、 Border -135 225 54,做永久 Angle 动画;From -135 到 -495;From 225 到 -585;From -54 到 -315;
对Ellipse的StrokeDashArray进行设置23 100就能达到效果;
Border 做为圆设置 Effect 可实现阴影效果;
1)RingLoading.cs代码如下;
using System.Windows;
using System.Windows.Controls;
namespace WPFDevelopers.Controls
{
public class RingLoading : Control
{
// Using a DependencyProperty as the backing store for IsStart. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IsStartProperty =
DependencyProperty.Register("IsStart", typeof(bool), typeof(RingLoading), new PropertyMetadata(default));
// Using a DependencyProperty as the backing store for ProgressValue. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ProgressValueProperty =
DependencyProperty.Register("ProgressValue", typeof(double), typeof(RingLoading),
new PropertyMetadata(0d, OnProgressValueChangedCallBack));
// Using a DependencyProperty as the backing store for Progress. This enables animation, styling, binding, etc...
internal static readonly DependencyProperty ProgressProperty =
DependencyProperty.Register("Progress", typeof(string), typeof(RingLoading), new PropertyMetadata(default));
// Using a DependencyProperty as the backing store for Maximum. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MaximumProperty =
DependencyProperty.Register("Maximum", typeof(double), typeof(RingLoading),
new PropertyMetadata(100d, OnMaximumPropertyChangedCallBack));
// Using a DependencyProperty as the backing store for Description. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DescriptionProperty =
DependencyProperty.Register("Description", typeof(string), typeof(RingLoading),
new PropertyMetadata(default));
static RingLoading()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(RingLoading),
new FrameworkPropertyMetadata(typeof(RingLoading)));
}
public bool IsStart
{
get => (bool)GetValue(IsStartProperty);
set => SetValue(IsStartProperty, value);
}
public double ProgressValue
{
get => (double)GetValue(ProgressValueProperty);
set => SetValue(ProgressValueProperty, value);
}
internal string Progress
{
get => (string)GetValue(ProgressProperty);
set => SetValue(ProgressProperty, value);
}
public double Maximum
{
get => (double)GetValue(MaximumProperty);
set => SetValue(MaximumProperty, value);
}
public string Description
{
get => (string)GetValue(DescriptionProperty);
set => SetValue(DescriptionProperty, value);
}
private static void OnProgressValueChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!(d is RingLoading control))
return;
if (!double.TryParse(e.NewValue?.ToString(), out var value))
return;
var progress = value / control.Maximum;
control.SetCurrentValue(ProgressProperty, progress.ToString("P0"));
}
private static void OnMaximumPropertyChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!(d is RingLoading control))
return;
if (!double.TryParse(e.NewValue?.ToString(), out var maxValue))
return;
if (maxValue <= 0)
return;
var progress = control.ProgressValue / maxValue;
control.SetCurrentValue(ProgressProperty, progress.ToString("P0"));
}
}
}
2)RingLoading.xaml代码如下;
<Style TargetType="controls:RingLoading" BasedOn="{StaticResource ControlBasicStyle}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="controls:RingLoading">
<ControlTemplate.Resources>
<Storyboard x:Key="PART_Resource_Storyboard" RepeatBehavior="Forever">
<DoubleAnimation To="-495" Duration="0:0:1.5" Storyboard.TargetName="PART_Ring1" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)"/>
<DoubleAnimation To="585" Duration="0:0:1.5" Storyboard.TargetName="PART_Ring2" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)"/>
<DoubleAnimation To="-315" Duration="0:0:1.5" Storyboard.TargetName="PART_Ring3" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)"/>
</Storyboard>
</ControlTemplate.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Viewbox HorizontalAlignment="Center" VerticalAlignment="Center" >
<Border Padding="10" Width="100" Height="100" >
<Grid>
<Grid x:Name="PART_Ring1" Width="60" Height="60" HorizontalAlignment="Center" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5">
<Grid.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="-135"/>
<TranslateTransform/>
</TransformGroup>
</Grid.RenderTransform>
<Ellipse Stroke="Red" StrokeThickness="2" StrokeDashArray="23 100" RenderTransformOrigin="0.5,0.5"/>
<Border Width="10" Height="10" CornerRadius="10" Background="Red" HorizontalAlignment="Right" Margin="0,0,-4,0">
<Border.Effect>
<DropShadowEffect BlurRadius="10" ShadowDepth="0" Color="Red"/>
</Border.Effect>
</Border>
</Grid>
<Grid x:Name="PART_Ring2" Width="60" Height="60" HorizontalAlignment="Left" VerticalAlignment="Bottom" RenderTransformOrigin="0.5,0.5">
<Grid.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="225"/>
<TranslateTransform/>
</TransformGroup>
</Grid.RenderTransform>
<Ellipse Stroke="Purple" StrokeThickness="2" StrokeDashArray="23 100"/>
<Border Width="10" Height="10" CornerRadius="10" Background="Purple" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0,0,0,-4">
<Border.Effect>
<DropShadowEffect BlurRadius="10" ShadowDepth="0" Color="Purple"/>
</Border.Effect>
</Border>
</Grid>
<Grid x:Name="PART_Ring3" Width="60" Height="60" HorizontalAlignment="Right" VerticalAlignment="Bottom" RenderTransformOrigin="0.5,0.5">
<Grid.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="45"/>
<TranslateTransform/>
</TransformGroup>
</Grid.RenderTransform>
<Ellipse Stroke="#0fb8b2" StrokeThickness="2" StrokeDashArray="23 100"/>
<Border Width="10" Height="10" CornerRadius="10" Background="#0fb8b2" HorizontalAlignment="Right" Margin="0,0,-4,0">
<Border.Effect>
<DropShadowEffect BlurRadius="10" ShadowDepth="0" Color="#0fb8b2"/>
</Border.Effect>
</Border>
</Grid>
</Grid>
</Border>
</Viewbox>
<StackPanel Grid.Row="1" Grid.ColumnSpan="2" Margin="10">
<TextBlock HorizontalAlignment="Center" Text="Loading..." Margin="0,0,0,15"/>
<TextBlock HorizontalAlignment="Center" Text="{TemplateBinding Description}" Margin="0,0,0,15"/>
<TextBlock HorizontalAlignment="Center" Text="{TemplateBinding Progress}" FontSize="{StaticResource TitleFontSize}"
FontWeight="Bold"/>
</StackPanel>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsStart" Value="True">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource PART_Resource_Storyboard}" x:Name="PART_BeginStoryboard"/>
</Trigger.EnterActions>
<Trigger.ExitActions>
<StopStoryboard BeginStoryboardName="PART_BeginStoryboard"/>
</Trigger.ExitActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
3)RingLoadingExample.xaml代码如下;
<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.RingLoadingExample"
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:wpfdev="https://github.com/WPFDevelopersOrg/WPFDevelopers"
xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<wpfdev:RingLoading IsStart="true"
Width="400" Height="400"
Description="WPFDevelopers" Foreground="Black" ProgressValue="50"/>
</Grid>
</UserControl>
RingLoading|Github
RingLoading|码云
RingLoading.xaml|Github
RingLoading.xaml|码云
我了解了ES6的特性,Generators引起了我的注意。突然想到的一件事是链接Promise对象,这是我无法用循环实现的。我们还能做哪些以前做不到的其他机制?我知道这是一个宽泛的问题,但目前我仍然想不出除了Promises之外的任何东西。 最佳答案 通过使用yield,生成器可以在函数控制流中的任何点暂停,从而保存当前的执行状态(作用域和堆栈)。没有生成器,这就更复杂了:你需要明确地跟踪状态分支和(尤其是)循环控制结构需要以函数式方式表示,即递归编写。生成器通常可用于遍历数据结构,创建一个简单的类似流的迭代器,按顺序生成所有元素。
我有一个网格[Grid1],它在单击按钮[search]时构建其数据行,我设法通过将其放置在UpdatePanel中对其进行Ajax化,并且工作正常。在AjaxifyingGrid1之前,单击Grid1中的一行时,另一个网格[Grid2]和一些其他控件[TextandLabels]用于填充/更新。Grid2和其他控件用于在Grid1的OnItemCommand事件上填充/更新。它是OnItemCommand中的代码,将相关数据绑定(bind)到Grid2和其他控件。在我将Grid1放入更新面板后,它们停止了更新。如果我将Grid2和其他控件放在同一个更新面板中,它会工作正常,但页面的设
如果这是一个愚蠢的问题,我深表歉意,我什至不确定最好的措辞方式......目前我有一个站点,其中可能有20多种不同的jQuery用法,每个页面都有所不同。我只是想知道存储此代码的最佳方式是什么?所有内容都在一个大的jquery.myfunctions.js文件中?并检查每个语句的元素是否存在?将脚本标签嵌入到每个单独的页面中?像上面那样使用PHP将不同的内容传递到脚本标记中?每页单独的.js文件?ims我根本不喜欢这个声音老实说,我什至不确定jQuery是否为你做了这件事,所以在每个页面上加载多个$('#whatever').function()没有任何问题明显的性能问题?关于这个的任
出于某种原因,我每次都这样做,因为我觉得它很干净。我在顶部声明变量以在下面使用它们。即使我只使用一次,我也会这样做。这是一个示例(使用jQuery框架):$("#tbListing").delegate("a.btnEdit","click",function(e){varstoreId=$(this).closest("tr").attr("id").replace("store-",""),storeName=$(this).closest("tr").find("td:eq(1)").html(),$currentRow=$(this).closest("tr");$curren
我想做的是检测使用Chrome开发工具所做的样式更改(通过修改现有规则或创建规则),以便在我的Web应用程序中我可以通过保存这些更改来保留它们。到目前为止,我能想到的唯一方法是遍历所有元素并获取它们的计算样式,但是此方法不适用于类。除非有某种方法可以获取类的样式信息,而无需实际将其分配给元素-或者遍历所有已知类,将其应用于元素并使用其计算样式?无论哪种方式,这似乎都是一个非常棘手的解决方案,我想知道是否有更好的方法来处理这个问题。我应该澄清一下——我不想使用开发工具本身将更改保存为完整文件。我想跟踪仅个别更改并且在来自javascript的应用程序本身的上下文中。这不是链接问题的副本。
我正在评估http://github.com/janl/mustache.js我正在考虑随着时间的推移它将如何运作。如果我只是构建一个巨大的对象,mustache是否足以将其转换为任何形式的HTML?所以,我的问题是。有什么是mustache做不到的吗?(我的想法是它只是从JSON到HTML的树转换,但我不确定如何验证它或获得足够的信心来反对它)进一步说明假设我只有一个巨大的对象,然后我在一次迭代中给了一个mustache模板;HTML中有什么东西不能通过它的语言用mustache表达。 最佳答案 由于Mustache只是JavaS
我正在使用AngularJS1.0.2与jQuery1.8.2并且我正在尝试让AngularJS将依赖项注入(inject)对象,就像它对Controller所做的那样。您可以在jsFiddle上找到一个基本示例,在那里你会发现两个Controller(List和NewItem),一个对象(Item)和一个带有服务的模块(名为服务和通信)。我的问题是Item:varItem=function(name,price){varself=this;self.name=name;self.price=price;self.pretty=function(){returnself.name+":
我嫉妒Rails的家伙。他们可以这样做:...我坚持这样做:是否有任何库可以压缩、gzip和合并多个js文件?CSS文件怎么样? 最佳答案 您可以使用ScriptManager/ScriptManagerProxy控制和定义CompositeScript中的脚本部分/属性。参见MSDNreference.它不一定会清理标记,但会将它们压缩在一起。 关于.net-如何在.NET中包含多个Javascript文件(就像它们在Rails中所做的那样),我们在StackOverflow上找到一个
作者|曾响铃文|响铃说数字经济时代磅礴而来,数字化相关的应用井喷式出现,作为“后方”的数据存储,重要性也在不断提升。有数据显示,当前平均一个企业的数据应用超过100种,应用数量每年翻番。在这种情况下,数据存储该如何深化发展来应对剧变中的需求,承担推动数字经济发展的底层责任,成为业界普遍关心的课题。而就在最近,华为伙伴暨开发者大会2022召开,华为存储在会上提出了“以数据为中心,构建面向多样化数据应用的可靠存储底座”的全新理念。这个全新理念的提出,是华为在多年存储技术积累之上,对其当下和未来存储技术和生态打法的一次诠释,从整个行业而言,也给出了未来存储应当如何走的华为理解,可以供业界参考。让万千
我已经在这里坐了将近一个小时来测试我正在构建的网站。因为我想查看我重新加载的代码中的新更改,但它正在重新加载旧代码。我打开了devetools硬重载和清空缓存硬重载,它们都加载了我的旧代码。我进入隐身模式,它做了同样的事情。我再次去devtools从设置中禁用缓存,并检查了网络选项卡中的禁用缓存;它仍然缓存我的旧代码。用于清除缓存的附加组件也不起作用。伙计,我以前没有遇到过这个问题,它只发生在昨晚,今天最糟糕。我现在很迷茫,因为chrome没有从我的javascript文件加载我的新更改。有解决办法吗? 最佳答案 此问题的一个解决方