StepBar.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.Specialized;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Windows.Controls;
  8. using System.Windows;
  9. namespace CyberX8_Themes.CustomControls
  10. {
  11. public class StepBar : ItemsControl
  12. {
  13. #region Private属性
  14. #endregion
  15. #region 依赖属性定义
  16. public int Progress
  17. {
  18. get { return (int)GetValue(ProgressProperty); }
  19. set { SetValue(ProgressProperty, value); }
  20. }
  21. public static readonly DependencyProperty ProgressProperty =
  22. DependencyProperty.Register("Progress", typeof(int), typeof(StepBar), new PropertyMetadata(0, OnProgressChangedCallback, OnProgressCoerceValueCallback));
  23. private static object OnProgressCoerceValueCallback(DependencyObject d, object baseValue)
  24. {
  25. //不让Progress超出边界
  26. StepBar stepBar = d as StepBar;
  27. int newValue = Convert.ToInt32(baseValue);
  28. if (newValue < 0)
  29. {
  30. return 0;
  31. }
  32. else if (newValue >= stepBar.Items.Count)
  33. {
  34. return stepBar.Items.Count - 1;
  35. }
  36. return newValue;
  37. }
  38. private static void OnProgressChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
  39. {
  40. }
  41. #endregion
  42. #region 依赖属性set get
  43. #endregion
  44. #region Constructors
  45. static StepBar()
  46. {
  47. DefaultStyleKeyProperty.OverrideMetadata(typeof(StepBar), new FrameworkPropertyMetadata(typeof(StepBar)));
  48. }
  49. #endregion
  50. #region Override方法
  51. protected override DependencyObject GetContainerForItemOverride()
  52. {
  53. return new StepBarItem();
  54. }
  55. protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
  56. {
  57. //设置Item的显示数字
  58. StepBarItem stepBarItem = element as StepBarItem;
  59. ItemsControl itemsControl = ItemsControl.ItemsControlFromItemContainer(stepBarItem);
  60. int index = itemsControl.ItemContainerGenerator.IndexFromContainer(stepBarItem);
  61. stepBarItem.Number = Convert.ToString(++index);
  62. base.PrepareContainerForItemOverride(element, item);
  63. }
  64. protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e)
  65. {
  66. base.OnItemsChanged(e);
  67. //ItemsControl数量变化时,重新设置各个Item的显示的数字
  68. for (int i = 0; i < this.Items.Count; i++)
  69. {
  70. StepBarItem stepBarItem = this.ItemContainerGenerator.ContainerFromIndex(i) as StepBarItem;
  71. if (stepBarItem != null)
  72. {
  73. int temp = i;
  74. stepBarItem.Number = Convert.ToString(++temp);
  75. }
  76. }
  77. //进度重新回到第一个
  78. this.Progress = 0;
  79. }
  80. #endregion
  81. #region Private方法
  82. #endregion
  83. }
  84. }