DrawingPresenter.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using System;
  2. using Avalonia.Controls.Shapes;
  3. using Avalonia.Media;
  4. using Avalonia.Metadata;
  5. namespace Avalonia.Controls
  6. {
  7. [Obsolete("Use Image control with DrawingImage source")]
  8. public class DrawingPresenter : Control
  9. {
  10. static DrawingPresenter()
  11. {
  12. AffectsMeasure<DrawingPresenter>(DrawingProperty);
  13. AffectsRender<DrawingPresenter>(DrawingProperty);
  14. }
  15. public static readonly StyledProperty<Drawing> DrawingProperty =
  16. AvaloniaProperty.Register<DrawingPresenter, Drawing>(nameof(Drawing));
  17. public static readonly StyledProperty<Stretch> StretchProperty =
  18. AvaloniaProperty.Register<DrawingPresenter, Stretch>(nameof(Stretch), Stretch.Uniform);
  19. [Content]
  20. public Drawing Drawing
  21. {
  22. get => GetValue(DrawingProperty);
  23. set => SetValue(DrawingProperty, value);
  24. }
  25. public Stretch Stretch
  26. {
  27. get => GetValue(StretchProperty);
  28. set => SetValue(StretchProperty, value);
  29. }
  30. private Matrix _transform = Matrix.Identity;
  31. protected override Size MeasureOverride(Size availableSize)
  32. {
  33. if (Drawing == null) return new Size();
  34. var (size, transform) = Shape.CalculateSizeAndTransform(availableSize, Drawing.GetBounds(), Stretch);
  35. _transform = transform;
  36. return size;
  37. }
  38. public override void Render(DrawingContext context)
  39. {
  40. if (Drawing != null)
  41. {
  42. using (context.PushPreTransform(_transform))
  43. using (context.PushClip(new Rect(Bounds.Size)))
  44. {
  45. Drawing.Draw(context);
  46. }
  47. }
  48. }
  49. }
  50. }