CompositionPage.axaml.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Numerics;
  5. using System.Threading.Tasks;
  6. using Avalonia;
  7. using Avalonia.Controls;
  8. using Avalonia.Controls.Primitives;
  9. using Avalonia.Interactivity;
  10. using Avalonia.Markup.Xaml;
  11. using Avalonia.Markup.Xaml.Templates;
  12. using Avalonia.Media;
  13. using Avalonia.Rendering.Composition;
  14. using Avalonia.Rendering.Composition.Animations;
  15. using Avalonia.VisualTree;
  16. namespace ControlCatalog.Pages;
  17. public partial class CompositionPage : UserControl
  18. {
  19. private ImplicitAnimationCollection _implicitAnimations;
  20. public CompositionPage()
  21. {
  22. AvaloniaXamlLoader.Load(this);
  23. }
  24. protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
  25. {
  26. base.OnAttachedToVisualTree(e);
  27. this.FindControl<ItemsControl>("Items").Items = CreateColorItems();
  28. }
  29. private List<CompositionPageColorItem> CreateColorItems()
  30. {
  31. var list = new List<CompositionPageColorItem>();
  32. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 255, 185, 0)));
  33. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 231, 72, 86)));
  34. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 0, 120, 215)));
  35. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 0, 153, 188)));
  36. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 122, 117, 116)));
  37. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 118, 118, 118)));
  38. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 255, 141, 0)));
  39. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 232, 17, 35)));
  40. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 0, 99, 177)));
  41. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 45, 125, 154)));
  42. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 93, 90, 88)));
  43. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 76, 74, 72)));
  44. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 247, 99, 12)));
  45. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 234, 0, 94)));
  46. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 142, 140, 216)));
  47. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 0, 183, 195)));
  48. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 104, 118, 138)));
  49. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 105, 121, 126)));
  50. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 202, 80, 16)));
  51. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 195, 0, 82)));
  52. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 107, 105, 214)));
  53. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 3, 131, 135)));
  54. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 81, 92, 107)));
  55. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 74, 84, 89)));
  56. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 218, 59, 1)));
  57. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 227, 0, 140)));
  58. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 135, 100, 184)));
  59. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 0, 178, 148)));
  60. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 86, 124, 115)));
  61. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 100, 124, 100)));
  62. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 239, 105, 80)));
  63. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 191, 0, 119)));
  64. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 116, 77, 169)));
  65. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 1, 133, 116)));
  66. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 72, 104, 96)));
  67. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 82, 94, 84)));
  68. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 209, 52, 56)));
  69. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 194, 57, 179)));
  70. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 177, 70, 194)));
  71. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 0, 204, 106)));
  72. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 73, 130, 5)));
  73. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 132, 117, 69)));
  74. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 255, 67, 67)));
  75. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 154, 0, 137)));
  76. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 136, 23, 152)));
  77. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 16, 137, 62)));
  78. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 16, 124, 16)));
  79. list.Add(new CompositionPageColorItem(Color.FromArgb(255, 126, 115, 95)));
  80. return list;
  81. }
  82. private void EnsureImplicitAnimations()
  83. {
  84. if (_implicitAnimations == null)
  85. {
  86. var compositor = ElementComposition.GetElementVisual(this)!.Compositor;
  87. var offsetAnimation = compositor.CreateVector3KeyFrameAnimation();
  88. offsetAnimation.Target = "Offset";
  89. offsetAnimation.InsertExpressionKeyFrame(1.0f, "this.FinalValue");
  90. offsetAnimation.Duration = TimeSpan.FromMilliseconds(400);
  91. var rotationAnimation = compositor.CreateScalarKeyFrameAnimation();
  92. rotationAnimation.Target = "RotationAngle";
  93. rotationAnimation.InsertKeyFrame(.5f, 0.160f);
  94. rotationAnimation.InsertKeyFrame(1f, 0f);
  95. rotationAnimation.Duration = TimeSpan.FromMilliseconds(400);
  96. var animationGroup = compositor.CreateAnimationGroup();
  97. animationGroup.Add(offsetAnimation);
  98. animationGroup.Add(rotationAnimation);
  99. _implicitAnimations = compositor.CreateImplicitAnimationCollection();
  100. _implicitAnimations["Offset"] = animationGroup;
  101. }
  102. }
  103. public static void SetEnableAnimations(Border border, bool value)
  104. {
  105. var page = border.FindAncestorOfType<CompositionPage>();
  106. if (page == null)
  107. {
  108. border.AttachedToVisualTree += delegate { SetEnableAnimations(border, true); };
  109. return;
  110. }
  111. if (ElementComposition.GetElementVisual(page) == null)
  112. return;
  113. page.EnsureImplicitAnimations();
  114. ElementComposition.GetElementVisual((Visual)border.GetVisualParent()).ImplicitAnimations =
  115. page._implicitAnimations;
  116. }
  117. }
  118. public class CompositionPageColorItem
  119. {
  120. public Color Color { get; private set; }
  121. public SolidColorBrush ColorBrush
  122. {
  123. get { return new SolidColorBrush(Color); }
  124. }
  125. public String ColorHexValue
  126. {
  127. get { return Color.ToString().Substring(3).ToUpperInvariant(); }
  128. }
  129. public CompositionPageColorItem(Color color)
  130. {
  131. Color = color;
  132. }
  133. }