DFSignatureControl.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. using InABox.Core;
  2. using InABox.WPF;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Windows;
  9. using System.Windows.Controls;
  10. using System.Windows.Media.Imaging;
  11. namespace InABox.DynamicGrid
  12. {
  13. public class DFSignatureControl : DynamicFormFieldControl<DFLayoutSignaturePad, DFLayoutSignaturePadProperties, byte[], byte[]?>
  14. {
  15. private Grid Grid = null!; // Late-initialised
  16. private Image Image = null!; // Late-initialised
  17. private bool _isEmpty = true;
  18. protected override FrameworkElement Create()
  19. {
  20. Grid = new Grid();
  21. Grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
  22. Grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
  23. Grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
  24. Grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
  25. Grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
  26. Image = new Image();
  27. Image.StretchDirection = StretchDirection.DownOnly;
  28. Image.Source = EmbeddedImageUtilities.CreateEmptySignature();
  29. var clearButton = new Button
  30. {
  31. Content = "Clear",
  32. Margin = new Thickness(0, 5, 5, 0),
  33. Width = 60,
  34. Height = 35
  35. };
  36. clearButton.Tag = Image;
  37. clearButton.Click += SignatureClear_Click;
  38. var editButton = new Button
  39. {
  40. Content = "Edit",
  41. Margin = new Thickness(0, 5, 0, 0),
  42. Width = 60,
  43. Height = 35
  44. };
  45. editButton.Tag = Image;
  46. editButton.Click += SignatureEdit_Click;
  47. Image.SetGridPosition(0, 0, 1, 3);
  48. clearButton.SetGridPosition(1, 1, 1, 1);
  49. editButton.SetGridPosition(1, 2, 1, 1);
  50. Grid.Children.Add(Image);
  51. Grid.Children.Add(clearButton);
  52. Grid.Children.Add(editButton);
  53. return Grid;
  54. }
  55. public override byte[]? GetSerializedValue()
  56. {
  57. return EmbeddedImageUtilities.SaveImageToBytes(Image, _isEmpty, new PngBitmapEncoder());
  58. }
  59. public override void SetSerializedValue(byte[]? value)
  60. {
  61. SetValue(value);
  62. }
  63. private void SignatureClear_Click(object sender, RoutedEventArgs e)
  64. {
  65. if (!_isEmpty)
  66. {
  67. Image.Source = EmbeddedImageUtilities.CreateEmptySignature();
  68. _isEmpty = true;
  69. ChangeField();
  70. }
  71. }
  72. private void SignatureEdit_Click(object sender, RoutedEventArgs e)
  73. {
  74. var window = new SignaturePadWindow(_isEmpty ? null : Image.Source);
  75. if (window.ShowDialog() == true)
  76. {
  77. Image.Source = window.Image ?? EmbeddedImageUtilities.CreateEmptySignature();
  78. _isEmpty = window.Image == null;
  79. ChangeField();
  80. }
  81. }
  82. public override byte[] GetValue()
  83. {
  84. return EmbeddedImageUtilities.SaveImageToBytes(Image, _isEmpty, new PngBitmapEncoder()) ?? Array.Empty<byte>();
  85. }
  86. public override void SetValue(byte[]? value)
  87. {
  88. _isEmpty = !EmbeddedImageUtilities.LoadImageFromData(Image, value, EmbeddedImageUtilities.CreateEmptySignature);
  89. }
  90. protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
  91. {
  92. base.OnPropertyChanged(e);
  93. if (e.Property == IsEnabledProperty)
  94. {
  95. Grid.RowDefinitions[1].Height = (bool)e.NewValue
  96. ? GridLength.Auto
  97. : new GridLength(0);
  98. }
  99. }
  100. protected override bool IsEmpty() => _isEmpty;
  101. }
  102. }