LineBoundsDemoControl.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using System;
  2. using Avalonia;
  3. using Avalonia.Controls;
  4. using Avalonia.Media;
  5. using Avalonia.Rendering.SceneGraph;
  6. using Avalonia.Threading;
  7. namespace RenderDemo.Controls
  8. {
  9. public class LineBoundsDemoControl : Control
  10. {
  11. static LineBoundsDemoControl()
  12. {
  13. AffectsRender<LineBoundsDemoControl>(AngleProperty);
  14. }
  15. public LineBoundsDemoControl()
  16. {
  17. var timer = new DispatcherTimer();
  18. timer.Interval = TimeSpan.FromSeconds(1 / 60);
  19. timer.Tick += (sender, e) => Angle += Math.PI / 360;
  20. timer.Start();
  21. }
  22. public static readonly StyledProperty<double> AngleProperty =
  23. AvaloniaProperty.Register<LineBoundsDemoControl, double>(nameof(Angle));
  24. public double Angle
  25. {
  26. get => GetValue(AngleProperty);
  27. set => SetValue(AngleProperty, value);
  28. }
  29. public override void Render(DrawingContext drawingContext)
  30. {
  31. var lineLength = Math.Sqrt((100 * 100) + (100 * 100));
  32. var diffX = LineBoundsHelper.CalculateAdjSide(Angle, lineLength);
  33. var diffY = LineBoundsHelper.CalculateOppSide(Angle, lineLength);
  34. var p1 = new Point(200, 200);
  35. var p2 = new Point(p1.X + diffX, p1.Y + diffY);
  36. var pen = new Pen(Brushes.Green, 20, lineCap: PenLineCap.Square);
  37. var boundPen = new Pen(Brushes.Black);
  38. drawingContext.DrawLine(pen, p1, p2);
  39. drawingContext.DrawRectangle(boundPen, LineBoundsHelper.CalculateBounds(p1, p2, pen));
  40. }
  41. }
  42. }