PathMeasurementPage.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using Avalonia;
  2. using Avalonia.Controls;
  3. using Avalonia.LogicalTree;
  4. using Avalonia.Media;
  5. using Avalonia.Media.Imaging;
  6. using Avalonia.Media.Immutable;
  7. namespace RenderDemo.Pages
  8. {
  9. public class PathMeasurementPage : Control
  10. {
  11. static PathMeasurementPage()
  12. {
  13. AffectsRender<PathMeasurementPage>(BoundsProperty);
  14. }
  15. private RenderTargetBitmap _bitmap;
  16. protected override void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e)
  17. {
  18. _bitmap = new RenderTargetBitmap(new PixelSize(500, 500), new Vector(96, 96));
  19. base.OnAttachedToLogicalTree(e);
  20. }
  21. protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e)
  22. {
  23. _bitmap.Dispose();
  24. _bitmap = null;
  25. base.OnDetachedFromLogicalTree(e);
  26. }
  27. readonly IPen strokePen = new ImmutablePen(Brushes.DarkBlue, 10d, null, PenLineCap.Round, PenLineJoin.Round);
  28. readonly IPen strokePen1 = new ImmutablePen(Brushes.Purple, 10d, null, PenLineCap.Round, PenLineJoin.Round);
  29. readonly IPen strokePen2 = new ImmutablePen(Brushes.Green, 10d, null, PenLineCap.Round, PenLineJoin.Round);
  30. readonly IPen strokePen3 = new ImmutablePen(Brushes.LightBlue, 10d, null, PenLineCap.Round, PenLineJoin.Round);
  31. readonly IPen strokePen4 = new ImmutablePen(Brushes.Red, 1d, null, PenLineCap.Round, PenLineJoin.Round);
  32. public override void Render(DrawingContext context)
  33. {
  34. using (var bitmapCtx = _bitmap.CreateDrawingContext())
  35. {
  36. var basePath = new PathGeometry();
  37. using (var basePathCtx = basePath.Open())
  38. {
  39. basePathCtx.BeginFigure(new Point(20, 20), false);
  40. basePathCtx.LineTo(new Point(400, 50));
  41. basePathCtx.LineTo(new Point(80, 100));
  42. basePathCtx.LineTo(new Point(300, 150));
  43. basePathCtx.EndFigure(false);
  44. }
  45. bitmapCtx.DrawGeometry(null, strokePen, basePath);
  46. var length = basePath.ContourLength;
  47. if (basePath.TryGetSegment(length * 0.05, length * 0.2, true, out var dst1))
  48. bitmapCtx.DrawGeometry(null, strokePen1, dst1);
  49. if (basePath.TryGetSegment(length * 0.2, length * 0.8, true, out var dst2))
  50. bitmapCtx.DrawGeometry(null, strokePen2, dst2);
  51. if (basePath.TryGetSegment(length * 0.8, length * 0.95, true, out var dst3))
  52. bitmapCtx.DrawGeometry(null, strokePen3, dst3);
  53. var pathBounds = basePath.GetRenderBounds(strokePen);
  54. bitmapCtx.DrawRectangle(null, strokePen4, pathBounds);
  55. }
  56. context.DrawImage(_bitmap,
  57. new Rect(0, 0, 500, 500),
  58. new Rect(0, 0, 500, 500));
  59. base.Render(context);
  60. }
  61. }
  62. }