123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- using Avalonia;
- using Avalonia.Controls;
- using Avalonia.Controls.Shapes;
- using Avalonia.Input;
- using Avalonia.Markup.Xaml;
- using Avalonia.Media;
- using Avalonia.Media.Imaging;
- using System.Collections.ObjectModel;
- namespace InABox.Avalonia.Components;
- public partial class InkCanvas : UserControl
- {
- public static readonly StyledProperty<double> LineThicknessProperty =
- AvaloniaProperty.Register<InkCanvas, double>(nameof(LineThickness), 3.0);
- public static readonly StyledProperty<Color> LineColourProperty =
- AvaloniaProperty.Register<InkCanvas, Color>(nameof(LineColour), Colors.Black);
- public double LineThickness
- {
- get => GetValue(LineThicknessProperty);
- set => SetValue(LineThicknessProperty, value);
- }
- public Color LineColour
- {
- get => GetValue(LineColourProperty);
- set => SetValue(LineColourProperty, value);
- }
- private ObservableCollection<Polyline> Lines = new();
- private Polyline? CurrentLine;
- public event EventHandler? Changed;
- public InkCanvas()
- {
- InitializeComponent();
- Lines.CollectionChanged += Lines_CollectionChanged;
- }
- public void Clear()
- {
- Canvas.Children.Clear();
- Lines.Clear();
- Changed?.Invoke(this, EventArgs.Empty);
- }
- public byte[] SaveImage()
- {
- var width = (int)Math.Floor(Canvas.Bounds.Width);
- var height = (int)Math.Floor(Canvas.Bounds.Height);
- var renderBitmap = new RenderTargetBitmap(new PixelSize(width, height));
- using var context = renderBitmap.CreateDrawingContext();
- foreach(var line in Lines)
- {
- line.Render(context);
- }
- using var stream = new MemoryStream();
- renderBitmap.Save(stream);
- return stream.ToArray();
- }
- private void Lines_CollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
- {
- Canvas.Children.Clear();
- foreach(var line in Lines)
- {
- if (!Canvas.Children.Contains(line))
- {
- Canvas.Children.Add(line);
- }
- }
- }
- Point ConvertToImageCoordinates(Point canvasCoordinates)
- {
- return canvasCoordinates;
- }
- private void Canvas_PointerPressed(object? sender, PointerPressedEventArgs e)
- {
- var position = ConvertToImageCoordinates(e.GetPosition(Canvas));
- CurrentLine = new Polyline
- {
- Points = new ObservableCollection<Point>(new Point[] { position }),
- StrokeThickness = LineThickness,
- Stroke = new SolidColorBrush(LineColour),
- StrokeJoin = PenLineJoin.Round,
- StrokeLineCap = PenLineCap.Round
- };
- Lines.Add(CurrentLine);
- }
- private void Canvas_PointerMoved(object? sender, PointerEventArgs e)
- {
- if(CurrentLine is not null)
- {
- var position = ConvertToImageCoordinates(e.GetPosition(Canvas));
- CurrentLine.Points.Add(position);
- }
- }
- private void Canvas_PointerReleased(object? sender, PointerReleasedEventArgs e)
- {
- if(CurrentLine is not null)
- {
- var position = ConvertToImageCoordinates(e.GetPosition(Canvas));
- CurrentLine.Points.Add(position);
- CurrentLine = null;
- Changed?.Invoke(this, new());
- }
- }
- }
|