2
0

DocumentRenderer.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using System.Collections.ObjectModel;
  2. using System.ComponentModel;
  3. using Avalonia.Threading;
  4. using QuestPDF.Drawing;
  5. using QuestPDF.Infrastructure;
  6. namespace QuestPDF.Previewer
  7. {
  8. internal class DocumentRenderer : INotifyPropertyChanged
  9. {
  10. public IDocument? Document { get; private set; }
  11. public event PropertyChangedEventHandler? PropertyChanged;
  12. private ObservableCollection<PreviewPage> _pages = new();
  13. public ObservableCollection<PreviewPage> Pages
  14. {
  15. get => _pages;
  16. set
  17. {
  18. if (_pages != value)
  19. {
  20. _pages = value;
  21. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Pages)));
  22. }
  23. }
  24. }
  25. public void UpdateDocument(IDocument? document)
  26. {
  27. Document = document;
  28. if (document == null)
  29. return;
  30. try
  31. {
  32. RenderDocument(document);
  33. }
  34. catch (Exception exception)
  35. {
  36. var exceptionDocument = new ExceptionDocument(exception);
  37. RenderDocument(exceptionDocument);
  38. }
  39. }
  40. private void RenderDocument(IDocument document)
  41. {
  42. var canvas = new PreviewerCanvas();
  43. DocumentGenerator.RenderDocument(canvas, document);
  44. foreach (var pages in Pages)
  45. pages?.Picture?.Dispose();
  46. Dispatcher.UIThread.Post(() =>
  47. {
  48. Pages.Clear();
  49. Pages = new ObservableCollection<PreviewPage>(canvas.Pictures);
  50. });
  51. }
  52. }
  53. }