超炫酷的WPF实现Loading控件效果

论坛 期权论坛     
niminba   2021-5-22 18:52   753   0
<p>Win8系统的Loading效果还是很不错的,网上也有人用CSS3等技术实现,研究了一下,并打算用WPF自定义一个Loading控件实现类似的效果,并可以让用户对Loading的颗粒(Particle)背景颜色进行自定义,话不多说,直接上代码:</p>
<p>1、用VS2012新建一个WPF的用户控件库项目WpfControlLibraryDemo,VS自动生成如下结构:</p>
<p style="text-align: center"><img alt="" id="theimg" onclick="window.open(this.src)" src="https://beijingoptbbs.oss-cn-hangzhou.aliyuncs.com/jb/2426819-cdc1833a0ef508bcc4484986c3897aec"></p>
<p>2、删除UserControl1.xaml,并新建一个Loading的CustomControl(不是UserControl),如下图所示:</p>
<p style="text-align: center"><img alt="" id="theimg" onclick="window.open(this.src)" src="https://beijingoptbbs.oss-cn-hangzhou.aliyuncs.com/jb/2426819-71745880d2a4776f4f261b10f473c2ea"></p>
<p>3、如果报错找不到Loading类型,请编译,下面在Generic.xaml主题文件中对Loading的样式和内容进行定义(注意添加</p>
<div class="blockcode">
<pre class="brush:csharp;">
xmlns:system = "clr-namespace:System;assembly=mscorlib"),代码如下:
&lt;ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system = "clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:WpfControlLibraryDemo"&gt;


&lt;Style TargetType="{x:Type local:Loading}"&gt;
&lt;Setter Property="Template"&gt;
  &lt;Setter.Value&gt;
  &lt;ControlTemplate TargetType="{x:Type local:Loading}"&gt;
   &lt;Border Background="{TemplateBinding Background}"
    BorderBrush="{TemplateBinding BorderBrush}"
    BorderThickness="{TemplateBinding BorderThickness}"&gt;
   &lt;Grid Width = "50" Height = "50"&gt;
    &lt;Grid.Resources&gt;
    &lt;!-- Value Converters --&gt;
   
    &lt;!-- Particle Styling ,must to has RelativeSource --&gt;
    &lt;SolidColorBrush x:Key = "ParticleColor" Color = "{Binding Path=FillColor,RelativeSource={RelativeSource TemplatedParent}}" /&gt;
    &lt;SolidColorBrush x:Key = "ParticleBackgroundColor" Color = "Transparent"/&gt;
    &lt;system:Double x:Key = "ParticleOpacity"&gt;1&lt;/system:Double&gt;
    &lt;system:Double x:Key = "ParticleRadius"&gt;5&lt;/system:Double&gt;

    &lt;system:Double x:Key = "StartingPointX"&gt;0&lt;/system:Double&gt;
    &lt;system:Double x:Key = "StartingPointY"&gt;-20&lt;/system:Double&gt;

    &lt;system:Double x:Key = "RotationPointX"&gt;0.5&lt;/system:Double&gt;
    &lt;system:Double x:Key = "RotationPointY"&gt;0.5&lt;/system:Double&gt;

    &lt;!-- StoryBoard --&gt;
    &lt;system:TimeSpan x:Key = "StoryBoardBeginTimeP0"&gt;00:00:00.000&lt;/system:TimeSpan&gt;
    &lt;system:TimeSpan x:Key = "StoryBoardBeginTimeP1"&gt;00:00:00.100&lt;/system:TimeSpan&gt;
    &lt;system:TimeSpan x:Key = "StoryBoardBeginTimeP2"&gt;00:00:00.200&lt;/system:TimeSpan&gt;
    &lt;system:TimeSpan x:Key = "StoryBoardBeginTimeP3"&gt;00:00:00.300&lt;/system:TimeSpan&gt;
    &lt;system:TimeSpan x:Key = "StoryBoardBeginTimeP4"&gt;00:00:00.400&lt;/system:TimeSpan&gt;
    &lt;Duration x:Key = "StoryBoardDuration"&gt;00:00:01.800&lt;/Duration&gt;

    &lt;!-- Particle Origin Angles --&gt;
    &lt;system:Double x:Key = "ParticleOriginAngleP0"&gt;0&lt;/system:Double&gt;
    &lt;system:Double x:Key = "ParticleOriginAngleP1"&gt;-10&lt;/system:Double&gt;
    &lt;system:Double x:Key = "ParticleOriginAngleP2"&gt;-20&lt;/system:Double&gt;
    &lt;system:Double x:Key = "ParticleOriginAngleP3"&gt;-30&lt;/system:Double&gt;
    &lt;system:Double x:Key = "ParticleOriginAngleP4"&gt;-40&lt;/system:Double&gt;

    &lt;!-- Particle Position &amp; Timing 1 --&gt;
    &lt;system:Double x:Key = "ParticleBeginAngle1"&gt;0&lt;/system:Double&gt;
    &lt;system:Double x:Key = "ParticleEndAngle1"&gt;90&lt;/system:Double&gt;
    &lt;system:TimeSpan x:Key = "ParticleBeginTime1"&gt;00:00:00.000&lt;/system:TimeSpan&gt;
    &lt;Duration x:Key = "ParticleDuration1"&gt;00:00:00.750&lt;/Duration&gt;

    &lt;!-- Particle Position &amp; Timing 2 --&gt;
    &lt;system:Double x:Key = "ParticleBeginAngle2"&gt;90&lt;/system:Double&gt;
    &lt;system:Double x:Key = "ParticleEndAngle2"&gt;270&lt;/system:Double&gt;
    &lt;system:TimeSpan x:Key = "ParticleBeginTime2"&gt;00:00:00.751&lt;/system:TimeSpan&gt;
    &lt;Duration x:Key = "ParticleDuration2"&gt;00:00:00.300&lt;/Duration&gt;

    &lt;!-- Particle Position &amp; Timing 3 --&gt;
    &lt;system:Double x:Key = "ParticleBeginAngle3"&gt;270&lt;/system:Double&gt;
    &lt;system:Double x:Key = "ParticleEndAngle3"&gt;360&lt;/system:Double&gt;
    &lt;system:TimeSpan x:Key = "ParticleBeginTime3"&gt;00:00:01.052&lt;/system:TimeSpan&gt;
    &lt;Duration x:Key = "ParticleDuration3"&gt;00:00:00.750&lt;/Duration&gt;

    &lt;Style x:Key = "EllipseStyle" TargetType = "Ellipse"&gt;
     &lt;Setter Property = "Width" Value = "{StaticResource ParticleRadius}"/&gt;
     &lt;Setter Property = "Height" Value = "{StaticResource ParticleRadius}"/&gt;
     &lt;Setter Property = "Fill" Value = "{StaticResource ParticleColor}"/&gt;
     &lt;Setter Property = "RenderTransformOrigin" Value = "0.5, 0.5"/&gt;
     &lt;Setter Property = "Opacity" Value = "{StaticResource ParticleOpacity}"/&gt;
    &lt;/Style&gt;
    &lt;/Grid.Resources&gt;
    &lt;Canvas Width = "1" Height = "1" Margin="0,0,0,0"&gt;
    &lt;Canvas.Triggers&gt;
     &lt;EventTrigger RoutedEvent = "Canvas.Loaded"&gt;
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP