WPF Adorner 简易图片取色器
2021-03-07 01:27
标签:onclick += ati win 问题 根据 属性 复制 ado
回答MSDN问题所写。 使用Adorner+附加属性 图片类(来自这位博主的博客) adorner代码 附加属性类 xaml代码 cs页面代码 WPF Adorner 简易图片取色器 标签:onclick += ati win 问题 根据 属性 复制 ado 原文地址:https://www.cnblogs.com/lonelyxmas/p/12833947.html ///
public class ShowImagePixelsPopup : Adorner
{
private TextBlock GetTextBlock;
private VisualCollection collection;
private UIElement _UIElement;
private Border GetBorder;
public ShowImagePixelsPopup(UIElement adornedElement) : base(adornedElement)
{
collection = new VisualCollection(this);
GetTextBlock = new TextBlock();
GetTextBlock.Height = 20;
GetTextBlock.Width = 120;
GetTextBlock.Background = new SolidColorBrush(Colors.Wheat);
GetTextBlock.HorizontalAlignment = HorizontalAlignment.Left;
GetTextBlock.VerticalAlignment = VerticalAlignment.Top;
GetBorder = new Border();
GetBorder.Height = 15;
GetBorder.Width = 15;
GetBorder.HorizontalAlignment = HorizontalAlignment.Left;
GetBorder.VerticalAlignment = VerticalAlignment.Top;
collection.Add(GetTextBlock);
collection.Add(GetBorder);
_UIElement = adornedElement;
}
protected override int VisualChildrenCount => collection.Count;
protected override Visual GetVisualChild(int index) => collection[index];
protected override Size MeasureOverride(Size constraint) => base.MeasureOverride(constraint);
public void SetData(Point MousePoint, String Pixels,Color color)
{
GetTextBlock.Margin = new Thickness(MousePoint.X+7.5, MousePoint.Y-15, 0,0);
GetBorder.Margin = new Thickness(MousePoint.X-7.5 , MousePoint.Y-7.5 , 0, 0);
GetBorder.Background = new SolidColorBrush(color);
GetTextBlock.Text = Pixels;
}
protected override Size ArrangeOverride(Size finalSize)
{
GetTextBlock.Arrange(new Rect(finalSize));
GetBorder.Arrange(new Rect(finalSize));
return base.ArrangeOverride(finalSize);
}
}
public class IsShowImagePixels
{
public static readonly DependencyProperty IsShowImagePixelsProperty = DependencyProperty.RegisterAttached("IsShowImagePixels", typeof(bool), typeof(IsShowImagePixels), new PropertyMetadata(false, new PropertyChangedCallback(OnIsShowImagePixelsChanged)));
public static void SetIsShowImagePixels(DependencyObject d, bool value) => d.SetValue(IsShowImagePixelsProperty, value);
public static bool GetIsShowImagePixels(DependencyObject d) => (bool)d.GetValue(IsShowImagePixelsProperty);
public static readonly DependencyProperty ShowImagePixelsPointProperty = DependencyProperty.RegisterAttached("ShowImagePixelsPoint", typeof(Point), typeof(IsShowImagePixels), new PropertyMetadata(new Point(0, 0),new PropertyChangedCallback(OnShowImagePixelsPointChanged)));
public static void SetIsShowImagePixelsPoint(DependencyObject d, Point value) => d.SetValue(ShowImagePixelsPointProperty, value);
public static Point GetShowImagePixelsPoint(DependencyObject d) => (Point)d.GetValue(ShowImagePixelsPointProperty);
private static void OnShowImagePixelsPointChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var c =(Point)e.NewValue;
popup.SetData(c, $"X={(((int)c.X ) ", imghelper.Pixels[((int)c.Y - 1) 0 ? 0 : (int)c.Y - 1][((int)c.X - 1) 0 ? 0 : (int)c.X - 1]);
}
private static AdornerLayer layer;
private static Imghelper imghelper;
private static ShowImagePixelsPopup popup;
private static void OnIsShowImagePixelsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var NewValue = (bool)e.NewValue;
UIElement element = d as UIElement;
if (!NewValue)
{
AdornerLayer l = AdornerLayer.GetAdornerLayer(element);
var ado = l.GetAdorners(element);
for (var o = 0; o )
l.Remove(ado[o]);
element.MouseMove -= Element_MouseMove;
imghelper = null;
popup = null;
layer = null;
element = null;
}
if (element == null)
return;
layer = AdornerLayer.GetAdornerLayer(element);
popup = new ShowImagePixelsPopup(element);
layer.Add(popup);
imghelper = new Imghelper((element as Image).Source as BitmapSource);
//显示鼠标位置
element.MouseMove += Element_MouseMove;
}
private static void Element_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
var c = e.GetPosition(sender as FrameworkElement);
//此处只是用了鼠标位置,也可以用ShowImagePixelsPoint直接指定位置
popup.SetData(c, $"X={(((int)c.X - 1) ", imghelper.Pixels[((int)c.Y - 1) 0 ? 0 : (int)c.Y - 1][((int)c.X - 1) 0 ? 0 : (int)c.X - 1]);
}
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var b = new BitmapImage(new Uri("timg.jpg", UriKind.RelativeOrAbsolute));
Imghelper imghelper = new Imghelper(b);
img.Source = b;
img.SetValue(IsShowImagePixels.IsShowImagePixelsProperty, true);
Set = true;
}
private bool Set = false;
private void Button_Click(object sender, RoutedEventArgs e)
{
if (Set)
Set = false;
else
Set = true;
img.SetValue(IsShowImagePixels.IsShowImagePixelsProperty, Set);
return;
}
}
文章标题:WPF Adorner 简易图片取色器
文章链接:http://soscw.com/index.php/essay/61113.html