ImageSelector.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. using System;
  2. using System.Windows;
  3. using System.Windows.Controls;
  4. using System.Windows.Input;
  5. using System.Windows.Media;
  6. using System.Windows.Media.Imaging;
  7. using HandyControl.Data;
  8. using HandyControl.Interactivity;
  9. using Microsoft.Win32;
  10. namespace HandyControl.Controls;
  11. public class ImageSelector : Control
  12. {
  13. public static readonly RoutedEvent ImageSelectedEvent =
  14. EventManager.RegisterRoutedEvent("ImageSelected", RoutingStrategy.Bubble,
  15. typeof(RoutedEventHandler), typeof(ImageSelector));
  16. public event RoutedEventHandler ImageSelected
  17. {
  18. add => AddHandler(ImageSelectedEvent, value);
  19. remove => RemoveHandler(ImageSelectedEvent, value);
  20. }
  21. public static readonly RoutedEvent ImageUnselectedEvent =
  22. EventManager.RegisterRoutedEvent("ImageUnselected", RoutingStrategy.Bubble,
  23. typeof(RoutedEventHandler), typeof(ImageSelector));
  24. public event RoutedEventHandler ImageUnselected
  25. {
  26. add => AddHandler(ImageUnselectedEvent, value);
  27. remove => RemoveHandler(ImageUnselectedEvent, value);
  28. }
  29. public ImageSelector() => CommandBindings.Add(new CommandBinding(ControlCommands.Switch, SwitchImage));
  30. private void SwitchImage(object sender, ExecutedRoutedEventArgs e)
  31. {
  32. if (!HasValue)
  33. {
  34. var dialog = new OpenFileDialog
  35. {
  36. RestoreDirectory = true,
  37. Filter = Filter,
  38. DefaultExt = DefaultExt
  39. };
  40. if (dialog.ShowDialog() == true)
  41. {
  42. SetValue(UriPropertyKey, new Uri(dialog.FileName, UriKind.RelativeOrAbsolute));
  43. SetValue(PreviewBrushPropertyKey, new ImageBrush(BitmapFrame.Create(Uri, BitmapCreateOptions.IgnoreImageCache, BitmapCacheOption.None))
  44. {
  45. Stretch = Stretch
  46. });
  47. SetValue(HasValuePropertyKey, ValueBoxes.TrueBox);
  48. SetCurrentValue(ToolTipProperty, dialog.FileName);
  49. RaiseEvent(new RoutedEventArgs(ImageSelectedEvent, this));
  50. }
  51. }
  52. else
  53. {
  54. SetValue(UriPropertyKey, default(Uri));
  55. SetValue(PreviewBrushPropertyKey, default(Brush));
  56. SetValue(HasValuePropertyKey, ValueBoxes.FalseBox);
  57. SetCurrentValue(ToolTipProperty, default);
  58. RaiseEvent(new RoutedEventArgs(ImageUnselectedEvent, this));
  59. }
  60. }
  61. public static readonly DependencyProperty StretchProperty = DependencyProperty.Register(
  62. nameof(Stretch), typeof(Stretch), typeof(ImageSelector), new PropertyMetadata(default(Stretch)));
  63. public Stretch Stretch
  64. {
  65. get => (Stretch) GetValue(StretchProperty);
  66. set => SetValue(StretchProperty, value);
  67. }
  68. public static readonly DependencyPropertyKey UriPropertyKey = DependencyProperty.RegisterReadOnly(
  69. "Uri", typeof(Uri), typeof(ImageSelector), new PropertyMetadata(default(Uri)));
  70. public static readonly DependencyProperty UriProperty = UriPropertyKey.DependencyProperty;
  71. public Uri Uri
  72. {
  73. get => (Uri) GetValue(UriProperty);
  74. set => SetValue(UriProperty, value);
  75. }
  76. public static readonly DependencyPropertyKey PreviewBrushPropertyKey = DependencyProperty.RegisterReadOnly(
  77. "PreviewBrush", typeof(Brush), typeof(ImageSelector), new PropertyMetadata(default(Brush)));
  78. public static readonly DependencyProperty PreviewBrushProperty = PreviewBrushPropertyKey.DependencyProperty;
  79. public Brush PreviewBrush
  80. {
  81. get => (Brush) GetValue(PreviewBrushProperty);
  82. set => SetValue(PreviewBrushProperty, value);
  83. }
  84. public static readonly DependencyProperty StrokeThicknessProperty = DependencyProperty.Register(
  85. nameof(StrokeThickness), typeof(double), typeof(ImageSelector), new FrameworkPropertyMetadata(ValueBoxes.Double1Box, FrameworkPropertyMetadataOptions.AffectsRender));
  86. public double StrokeThickness
  87. {
  88. get => (double) GetValue(StrokeThicknessProperty);
  89. set => SetValue(StrokeThicknessProperty, value);
  90. }
  91. public static readonly DependencyProperty StrokeDashArrayProperty = DependencyProperty.Register(
  92. nameof(StrokeDashArray), typeof(DoubleCollection), typeof(ImageSelector), new FrameworkPropertyMetadata(default(DoubleCollection), FrameworkPropertyMetadataOptions.AffectsRender));
  93. public DoubleCollection StrokeDashArray
  94. {
  95. get => (DoubleCollection) GetValue(StrokeDashArrayProperty);
  96. set => SetValue(StrokeDashArrayProperty, value);
  97. }
  98. public static readonly DependencyProperty DefaultExtProperty = DependencyProperty.Register(
  99. nameof(DefaultExt), typeof(string), typeof(ImageSelector), new PropertyMetadata(".jpg"));
  100. public string DefaultExt
  101. {
  102. get => (string) GetValue(DefaultExtProperty);
  103. set => SetValue(DefaultExtProperty, value);
  104. }
  105. public static readonly DependencyProperty FilterProperty = DependencyProperty.Register(
  106. nameof(Filter), typeof(string), typeof(ImageSelector), new PropertyMetadata("(.jpg)|*.jpg|(.png)|*.png"));
  107. public string Filter
  108. {
  109. get => (string) GetValue(FilterProperty);
  110. set => SetValue(FilterProperty, value);
  111. }
  112. public static readonly DependencyPropertyKey HasValuePropertyKey = DependencyProperty.RegisterReadOnly(
  113. "HasValue", typeof(bool), typeof(ImageSelector), new PropertyMetadata(ValueBoxes.FalseBox));
  114. public static readonly DependencyProperty HasValueProperty = HasValuePropertyKey.DependencyProperty;
  115. public bool HasValue
  116. {
  117. get => (bool) GetValue(HasValueProperty);
  118. set => SetValue(HasValueProperty, ValueBoxes.BooleanBox(value));
  119. }
  120. }