ImagePropertyEditor.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using System;
  2. using System.Windows;
  3. using System.Windows.Data;
  4. using System.Windows.Media;
  5. using System.Windows.Media.Imaging;
  6. namespace HandyControl.Controls;
  7. public class ImagePropertyEditor : PropertyEditorBase
  8. {
  9. public override FrameworkElement CreateElement(PropertyItem propertyItem)
  10. {
  11. var imageSelector = new ImageSelector
  12. {
  13. IsEnabled = !propertyItem.IsReadOnly,
  14. Width = 50,
  15. Height = 50,
  16. HorizontalAlignment = HorizontalAlignment.Left
  17. };
  18. BindingOperations.SetBinding(this, UriProperty, new Binding(ImageSelector.UriProperty.Name)
  19. {
  20. Source = imageSelector,
  21. Mode = BindingMode.OneWay
  22. });
  23. return imageSelector;
  24. }
  25. internal static readonly DependencyProperty UriProperty = DependencyProperty.Register(
  26. nameof(Uri), typeof(Uri), typeof(ImagePropertyEditor), new PropertyMetadata(default(Uri), OnUriChangedCallback));
  27. private static void OnUriChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) =>
  28. ((ImagePropertyEditor) d).Source = e.NewValue is Uri uri ? BitmapFrame.Create(uri) : null;
  29. internal Uri Uri
  30. {
  31. get => (Uri) GetValue(UriProperty);
  32. set => SetValue(UriProperty, value);
  33. }
  34. public static readonly DependencyProperty SourceProperty = DependencyProperty.Register(
  35. nameof(Source), typeof(ImageSource), typeof(ImagePropertyEditor), new PropertyMetadata(default(ImageSource)));
  36. public ImageSource Source
  37. {
  38. get => (ImageSource) GetValue(SourceProperty);
  39. set => SetValue(SourceProperty, value);
  40. }
  41. public override void CreateBinding(PropertyItem propertyItem, DependencyObject element)
  42. => BindingOperations.SetBinding(this, GetDependencyProperty(),
  43. new Binding($"({propertyItem.PropertyName})")
  44. {
  45. Source = propertyItem.Value,
  46. Mode = GetBindingMode(propertyItem),
  47. UpdateSourceTrigger = GetUpdateSourceTrigger(propertyItem),
  48. Converter = GetConverter(propertyItem)
  49. });
  50. public override DependencyProperty GetDependencyProperty() => SourceProperty;
  51. }