先看效果图:

最直观的,这是4个圆点在移动,就用一个横向的StackPanel表示这四个点吧。

  1. <StackPanel Orientation="Horizontal">
  2. <StackPanel.Resources>
  3. <Style TargetType="{x:Type Border}">
  4. <Setter Property="BorderBrush" Value="Transparent"/>
  5. <Setter Property="BorderThickness" Value=""/>
  6. <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource AncestorType=UserControl, AncestorLevel=1}, Path= Foreground}"/>
  7. <Setter Property="CornerRadius" Value=""/>
  8. <Setter Property="Height" Value=""/>
  9. <Setter Property="Width" Value=""/>
  10. </Style>
  11. </StackPanel.Resources>
  12. <Border x:Name="border4" Margin="0,0,5,0" RenderTransformOrigin="0.5,0.5">
  13. <Border.RenderTransform>
  14. <TransformGroup>
  15. <ScaleTransform/>
  16. <SkewTransform/>
  17. <RotateTransform/>
  18. <TranslateTransform/>
  19. </TransformGroup>
  20. </Border.RenderTransform>
  21. </Border>
  22. <Border x:Name="border3" Margin="0,0,5,0" RenderTransformOrigin="0.5,0.5">
  23. <Border.RenderTransform>
  24. <TransformGroup>
  25. <ScaleTransform/>
  26. <SkewTransform/>
  27. <RotateTransform/>
  28. <TranslateTransform/>
  29. </TransformGroup>
  30. </Border.RenderTransform>
  31. </Border>
  32. <Border x:Name="border2" Margin="0,0,5,0" RenderTransformOrigin="0.5,0.5">
  33. <Border.RenderTransform>
  34. <TransformGroup>
  35. <ScaleTransform/>
  36. <SkewTransform/>
  37. <RotateTransform/>
  38. <TranslateTransform/>
  39. </TransformGroup>
  40. </Border.RenderTransform>
  41. </Border>
  42. <Border x:Name="border1" RenderTransformOrigin="0.5,0.5">
  43. <Border.RenderTransform>
  44. <TransformGroup>
  45. <ScaleTransform/>
  46. <SkewTransform/>
  47. <RotateTransform/>
  48. <TranslateTransform/>
  49. </TransformGroup>
  50. </Border.RenderTransform>
  51. </Border>
  52. </StackPanel>

圆点的颜色绑定在用户控件的Foreground上面。在调用控件的时候记得对其Foreground赋值以便显示适合的颜色。

这个动画实际上很简单,分为5个部分:

1.准备部分:准备向前移动

2.正向加速度部分:移动速度越来越快

3.匀速部分:慢速匀速移动

4.负向加速度部分:移动速度越来越慢

5.等待部分:等待所有动画完成

动画代码如下:

  1. <Storyboard x:Key="sbKey" Completed="Storyboard_Completed" >
  2. <!--最右边-->
  3. <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="border1">
  4. <EasingDoubleKeyFrame KeyTime="0:0:0" Value="0"/>
  5. <EasingDoubleKeyFrame KeyTime="0:0:0.8">
  6. <EasingDoubleKeyFrame.EasingFunction>
  7. <CircleEase EasingMode="EaseOut"/>
  8. </EasingDoubleKeyFrame.EasingFunction>
  9. </EasingDoubleKeyFrame>
  10. <EasingDoubleKeyFrame KeyTime="0:0:1.2"/>
  11. <EasingDoubleKeyFrame KeyTime="0:0:2">
  12. <EasingDoubleKeyFrame.EasingFunction>
  13. <CircleEase EasingMode="EaseIn"/>
  14. </EasingDoubleKeyFrame.EasingFunction>
  15. </EasingDoubleKeyFrame>
  16. <EasingDoubleKeyFrame KeyTime="0:0:2.6"/>
  17. </DoubleAnimationUsingKeyFrames>
  18. <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="border2">
  19. <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="0" x:Name="_2_1">
  20. <EasingDoubleKeyFrame.EasingFunction>
  21. <CircleEase EasingMode="EaseOut"/>
  22. </EasingDoubleKeyFrame.EasingFunction>
  23. </EasingDoubleKeyFrame>
  24. <EasingDoubleKeyFrame KeyTime="0:0:0.9" Value="190" x:Name="_2_2">
  25. <EasingDoubleKeyFrame.EasingFunction>
  26. <CircleEase EasingMode="EaseOut"/>
  27. </EasingDoubleKeyFrame.EasingFunction>
  28. </EasingDoubleKeyFrame>
  29. <EasingDoubleKeyFrame KeyTime="0:0:1.3" Value="210" x:Name="_2_3"/>
  30. <EasingDoubleKeyFrame KeyTime="0:0:2.1" Value="400" x:Name="_2_4">
  31. <EasingDoubleKeyFrame.EasingFunction>
  32. <CircleEase EasingMode="EaseIn"/>
  33. </EasingDoubleKeyFrame.EasingFunction>
  34. </EasingDoubleKeyFrame>
  35. <EasingDoubleKeyFrame KeyTime="0:0:2.6" Value="400" x:Name="_2_5"/>
  36. </DoubleAnimationUsingKeyFrames>
  37. <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="border3">
  38. <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0" x:Name="_3_1">
  39. <EasingDoubleKeyFrame.EasingFunction>
  40. <CircleEase EasingMode="EaseOut"/>
  41. </EasingDoubleKeyFrame.EasingFunction>
  42. </EasingDoubleKeyFrame>
  43. <EasingDoubleKeyFrame KeyTime="0:0:1.0" Value="190" x:Name="_3_2">
  44. <EasingDoubleKeyFrame.EasingFunction>
  45. <CircleEase EasingMode="EaseOut"/>
  46. </EasingDoubleKeyFrame.EasingFunction>
  47. </EasingDoubleKeyFrame>
  48. <EasingDoubleKeyFrame KeyTime="0:0:1.4" Value="210" x:Name="_3_3"/>
  49. <EasingDoubleKeyFrame KeyTime="0:0:2.2" Value="400" x:Name="_3_4">
  50. <EasingDoubleKeyFrame.EasingFunction>
  51. <CircleEase EasingMode="EaseIn"/>
  52. </EasingDoubleKeyFrame.EasingFunction>
  53. </EasingDoubleKeyFrame>
  54. <EasingDoubleKeyFrame KeyTime="0:0:2.6" Value="400" x:Name="_3_5"/>
  55. </DoubleAnimationUsingKeyFrames>
  56. <!--最左边-->
  57. <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="border4">
  58. <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0" x:Name="_4_1">
  59. <EasingDoubleKeyFrame.EasingFunction>
  60. <CircleEase EasingMode="EaseOut"/>
  61. </EasingDoubleKeyFrame.EasingFunction>
  62. </EasingDoubleKeyFrame>
  63. <EasingDoubleKeyFrame KeyTime="0:0:1.1" Value="190" x:Name="_4_2">
  64. <EasingDoubleKeyFrame.EasingFunction>
  65. <CircleEase EasingMode="EaseOut"/>
  66. </EasingDoubleKeyFrame.EasingFunction>
  67. </EasingDoubleKeyFrame>
  68. <EasingDoubleKeyFrame KeyTime="0:0:1.5" Value="210" x:Name="_4_3"/>
  69. <EasingDoubleKeyFrame KeyTime="0:0:2.3" Value="400" x:Name="_4_4">
  70. <EasingDoubleKeyFrame.EasingFunction>
  71. <CircleEase EasingMode="EaseIn"/>
  72. </EasingDoubleKeyFrame.EasingFunction>
  73. </EasingDoubleKeyFrame>
  74. <EasingDoubleKeyFrame KeyTime="0:0:2.6" Value="400" x:Name="_4_5"/>
  75. </DoubleAnimationUsingKeyFrames>
  76. </Storyboard>

由于动画需要自适应宽度,所以部分关键帧的值无法在XAML中表现出来,只有在后台进行动态处理。

当控件的宽度发生变化时需要更新动画部分关键帧:

  1. /// <summary>
  2. /// 当控件的大小发生变化时
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void UserControl_SizeChanged(object sender, SizeChangedEventArgs e)
  7. {
  8. //当控件的宽度发生变化时
  9. if(e.WidthChanged)
  10. {
  11. isNeedUpdateStoryboard = true;
  12. }
  13. }

当动画每一次执行完毕后,下一次执行之前,判断是否需要更新部分关键帧,所以响应动画的Completed事件:

  1. /// <summary>
  2. /// 动画执行完毕
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void Storyboard_Completed(object sender, EventArgs e)
  7. {
  8. //每次动画执行完毕后判断是否需要更新动画
  9. if(isNeedUpdateStoryboard)
  10. {
  11. UpdateStoryboard();
  12. }
  13.  
  14. isNeedUpdateStoryboard = false;
  15. storyboard.Begin(this);
  16. }
  1. /// <summary>
  2. /// 更新动画部分关键帧
  3. /// </summary>
  4. private void UpdateStoryboard()
  5. {
  6. //获取控件的实际宽度,减去4个点占用的宽度
  7. double realWidth = this.ActualWidth - ;
  8. //正向加速度占比47.5%
  9. double _0Width = realWidth * 0.475;
  10. //匀速部分占比5%
  11. double _1Width = _0Width + realWidth * 0.05;
  12.  
  13. //根据控件的实际大小动态更改动画
  14. #region 右边第一个
  15. var _0 = storyboard.Children[] as DoubleAnimationUsingKeyFrames;
  16. var _0_1 = _0.KeyFrames[] as EasingDoubleKeyFrame;
  17. var _0_2 = _0.KeyFrames[] as EasingDoubleKeyFrame;
  18. var _0_3 = _0.KeyFrames[] as EasingDoubleKeyFrame;
  19. var _0_4 = _0.KeyFrames[] as EasingDoubleKeyFrame;
  20.  
  21. _0_1.Value = _0Width;
  22. _0_2.Value = _1Width;
  23. _0_3.Value = realWidth;
  24. _0_4.Value = realWidth;
  25. #endregion
  26.  
  27. #region 右边倒数第二个
  28. var _1 = storyboard.Children[] as DoubleAnimationUsingKeyFrames;
  29. var _1_1 = _1.KeyFrames[] as EasingDoubleKeyFrame;
  30. var _1_2 = _1.KeyFrames[] as EasingDoubleKeyFrame;
  31. var _1_3 = _1.KeyFrames[] as EasingDoubleKeyFrame;
  32. var _1_4 = _1.KeyFrames[] as EasingDoubleKeyFrame;
  33.  
  34. _1_1.Value = _0Width;
  35. _1_2.Value = _1Width;
  36. _1_3.Value = realWidth;
  37. _1_4.Value = realWidth;
  38. #endregion
  39.  
  40. #region 右边倒数第三个
  41. var _2 = storyboard.Children[] as DoubleAnimationUsingKeyFrames;
  42. var _2_1 = _2.KeyFrames[] as EasingDoubleKeyFrame;
  43. var _2_2 = _2.KeyFrames[] as EasingDoubleKeyFrame;
  44. var _2_3 = _2.KeyFrames[] as EasingDoubleKeyFrame;
  45. var _2_4 = _2.KeyFrames[] as EasingDoubleKeyFrame;
  46.  
  47. _2_1.Value = _0Width;
  48. _2_2.Value = _1Width;
  49. _2_3.Value = realWidth;
  50. _2_4.Value = realWidth;
  51. #endregion
  52.  
  53. #region 右边倒数第四个
  54. var _3 = storyboard.Children[] as DoubleAnimationUsingKeyFrames;
  55. var _3_1 = _3.KeyFrames[] as EasingDoubleKeyFrame;
  56. var _3_2 = _3.KeyFrames[] as EasingDoubleKeyFrame;
  57. var _3_3 = _3.KeyFrames[] as EasingDoubleKeyFrame;
  58. var _3_4 = _3.KeyFrames[] as EasingDoubleKeyFrame;
  59.  
  60. _3_1.Value = _0Width;
  61. _3_2.Value = _1Width;
  62. _3_3.Value = realWidth;
  63. _3_4.Value = realWidth;
  64. #endregion
  65. }

最后提供动画的开始和结束调用:

  1. /// <summary>
  2. /// 使进度条开始滚动
  3. /// </summary>
  4. public void Start()
  5. {
  6. this.Visibility = System.Windows.Visibility.Visible;
  7. UpdateStoryboard();
  8. storyboard.Begin(this, true);
  9. }
  10. /// <summary>
  11. /// 使进度条停止滚动
  12. /// </summary>
  13. public void Stop()
  14. {
  15. this.Visibility = System.Windows.Visibility.Collapsed;
  16. storyboard.Stop(this);
  17. }

源代码下载:http://download.csdn.net/detail/lyclovezmy/7598897

WPF:Metro样式ProgressBar(圆点横向移动),自适应宽度的更多相关文章

  1. ASP.NET实例——漂亮的自适应宽度的导航条(仿Discuz!)

    PHP比较成熟的开放的源代码比较多,比方说PrestaShop,比方说Discuz!...... 虽然语言不同,但基本原理是一样的,有时间的话读一读,对学习ASP.NET应该是非常有好处的(唉,什么时 ...

  2. shrink-to-fit(自适应宽度)

    自适应宽度是指当未明白设定容器的宽度(或外边距设为auto)时,在特定的情况下容器的宽度会依据情况自行设定.而设定的结果往往并非我们想要的. W3C规范中描写叙述了几种shrink-to-fit的情况 ...

  3. 从三栏自适应宽度布局到css布局的讨论

    如何实现一个三栏自适应布局,左右各100px,中间随着浏览器宽度自适应? 第一个想到的是使用table布局,设置table的宽度为100%,三个td,第1个和第3个固定宽度为100px,那么中间那个就 ...

  4. UEditor百度富文本编辑器--让编辑器自适应宽度的解决方案

    UEditor百度富文本编辑器的initialFrameWidth属性,默认值是1000. 不能够自适应屏幕宽度.如图1: 刚开始的时候,我是直接设置initialFrameWidth=null的.效 ...

  5. JS实现自适应宽度的Tag切换

    效果体验:http://hovertree.com/texiao/js/3.htm 该效果使用纯JavaScript代码,实现TAB页切换效果,TAB标签根据内容自适应宽度,点击TAB标签切换内容页. ...

  6. WPF设置DataGrid行内容高度自适应 与 TextBox/TextBlock内容高度自适应

    WPF设置DataGrid行内容高度自适应  TextBox/TextBlock内容高度自适应  参考: DataGrid 控件中的调整大小选项: http://msdn.microsoft.com/ ...

  7. RelativeLayout中的格局,自适应宽度布局

    RelativeLayout中的布局,自适应宽度布局 该图片中为android布局:总布局为 RelativeLayoutAtLeft 为居左 <TextView android:backgro ...

  8. Qt的tablewidget行列头自适应宽度

    Qt构造一个TableWidget后,窗口最大化后,列头默认不能自适应宽度,研究了一下,Qt提供了两种方式来处理这个问题,如下:   1. 使用horizontalHeader()->setRe ...

  9. [Winform]DataGridView列自适应宽度

    引言 在做winform项目中,数据控件DataGridView的使用多多少少是会用到的,如果不设置它的属性,默认情况下是不会自适应宽度的,你想查看某项的数据,就不得不将标题栏拖来拖去,挺烦的. 方法 ...

随机推荐

  1. Mac环境下PHP连接mysql提示Server sent charset (255) unknown和(HY000/2054)

    错误提示: mysqli_connect(): Server sent charset (255) unknown to the client. Please, report to the devel ...

  2. @vue/cli 构建得项目eslint配置2

    使用ESLint+Prettier来统一前端代码风格 加分号还是不加分号?tab还是空格?你还在为代码风格与同事争论得面红耳赤吗? 正文之前,先看个段子放松一下: 去死吧!你这个异教徒! 想起自己刚入 ...

  3. mysql 开发基础系列3 日期数据类型

    日期类型 如果要用来表示年月日,通常用DATE 来表示. 如果要用来表示年月日时分秒,通常用DATETIME 表示. 如果只用来表示时分秒,通常用TIME 来表示. TIMESTAMP表示格式 :YY ...

  4. 微信支付之手机H5支付实践

    最近项目中支付部分涉及到微信支付,使用的是h5支付,官方文档中是没有demo的,所以摸着石头过河,将踩过的坑记录如下. 一 应用场景 H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前 ...

  5. MFC原理第六讲.消息传递

    ---恢复内容开始--- MFC原理第六讲.消息传递 一丶简介 通过上一讲我们的消息映射表.我们得知. 消息映射表 会保存父类的MessageMap 以及自己当前的消息结构体数组. 消息传递是一层一层 ...

  6. [UWP]为什么ContentControl的ControlTemplate里放两个ContentPresenter会出问题(绕口)

    1. 简单的HeaderedContentControl 上周五收到反馈,在一个ContentControl的ControlTemplate中放两个ContentPresenter会出错.出错的例子是 ...

  7. Python中的数据结构

    Python中的数据结构 这里总结一下Python中的内置数据结构(Built-in Data Structure):列表list.元组tuple.字典dict.集合set,涵盖的仅有部分重点,详细地 ...

  8. Angular2入门:TypeScript的类 - 参数属性:定义和初始化类成员

  9. ZooKeeper 初体验

    安装Zookeeper Mac OS Mac 用户可以使用 Homebrew 安装和管理 Zookeeper 服务: brew install zookeeper 配置文件地址在: /usr/loca ...

  10. iOS main.m解析

    在iOS开发中,有一个文件main.m,可能并不是很引起开发的注意.不过,可能在面试过程中,面试官还是有些会问到主函数里面到底做了哪些工作和任务.下面我们主要看一下main.m内部的逻辑. #impo ...