这个事比较复杂,不过相对与FYJ.Winfrom中实现的可是简单许多了,这之前有点小问题,就是启动后要点两次才会换色,后来就一次,始终没打找到原因

private void CanvImage_sMouseDown(object sender, MouseButtonEventArgs e)
{
Point p = e.GetPosition((IInputElement)sender);
this.ellipsePixel_s.SetValue(Canvas.LeftProperty, p.X - 4);
this.ellipsePixel_s.SetValue(Canvas.TopProperty, p.Y - 4);
this.ellipsePixel_s.Tag = (p.X - 4) + "," + (p.Y - 4);
ChangeColor();
}
private void CanvImage_hlMouseDown(object sender, MouseButtonEventArgs e)
{
Point p = e.GetPosition((IInputElement)sender);
this.ellipsePixel_hl.SetValue(Canvas.LeftProperty, p.X - 4);
this.ellipsePixel_hl.SetValue(Canvas.TopProperty, p.Y - 4);
this.ellipsePixel_hl.Tag = (p.X - 4) + "," + (p.Y - 4);
ChangeColor();
}后来把坐标位置保存到tag属性可以了...
来看看XAML代码
后台代码
using FYJ.Winui.Util;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace FYJ.Winui
{
/// /// ColorPickerWindow.xaml 的交互逻辑
/// public partial class ColorPickerWindow : Window
{
private bool isLoaded = false;
public ColorPickerWindow()
{
InitializeComponent();
this.Loaded += delegate
{
//ChangePostion(this.CurrentColor);
try
{
Point point_hl = this.ellipsePixel_hl.TranslatePoint(new Point(0, 0), this.CanvImage_hl);
this.ellipsePixel_hl.Tag = point_hl.X + "," + point_hl.Y;
Point point_s = this.ellipsePixel_s.TranslatePoint(new Point(0, 0), this.CanvImage_s);
this.ellipsePixel_s.Tag = point_s.X + "," + point_s.Y;
ChangeColor();
InitSkinImage();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
isLoaded = true;
};
}
/// /// 加载初始图片选择器
/// private void InitSkinImage()
{
WrapPanel wp = new WrapPanel();
ControlTemplate skinTemplate = (ControlTemplate)App.Current.Resources["skinTemplate"];
Button btn = new Button();
btn.Template = skinTemplate;
wp.Children.Add(btn);
}
public delegate void ColorChangedEventHandler(System.Windows.Media.Color color);
public event ColorChangedEventHandler ColorChanged;
public delegate void SkinChangedEventHandler(BitmapSource imageSource);
public event SkinChangedEventHandler SkinChanged;
public delegate void OpacityChangedEventHandler(int value);
public event OpacityChangedEventHandler OpacityChanged;
[DllImport("gdi32.dll", SetLastError = true)]
private static extern bool DeleteObject(IntPtr hObject);
private BitmapSource ChangeBitmapToImageSource(System.Drawing.Bitmap bitmap)
{
//IntPtr hBitmap = bitmap.GetHbitmap();
//ImageSource wpfBitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
// hBitmap,
// IntPtr.Zero,
// Int32Rect.Empty,
// BitmapSizeOptions.FromEmptyOptions());
//if (!DeleteObject(hBitmap))
//{
// throw new System.ComponentModel.Win32Exception();
//}
//return wpfBitmap;
BitmapSource bs = Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
return bs;
}
private void ChangeColor()
{
//获取ellipsePixel_s相对于CanvImage_s坐标方法一
//GeneralTransform generalTransform1 = this.CanvImage_s.TransformToVisual(this.ellipsePixel_s);
// Point point_s = generalTransform1.Transform(new Point(0, 0));
//获取ellipsePixel_s相对于CanvImage_s坐标方法二
//Point point_s = this.ellipsePixel_s.TranslatePoint(new Point(0, 0), this.CanvImage_s);
double x_s = Convert.ToDouble(this.ellipsePixel_s.Tag.ToString().Split(',')[0]);
double y_s = Convert.ToDouble(this.ellipsePixel_s.Tag.ToString().Split(',')[1]);
Point point_s = new Point(x_s, y_s);
System.Drawing.Bitmap bm_hl = new System.Drawing.Bitmap(360, 100);
for (int i = 0; i < 360; i++)
{
for (int j = 0; j < 100; j++)
{
bm_hl.SetPixel(i, j, new HSLColor(255, i, (point_s.X + 4) / 360.0, j / 100.0).Color);
}
}
this.pickerImage_hl.Source = ChangeBitmapToImageSource(bm_hl);
double x_hl = Convert.ToDouble(this.ellipsePixel_hl.Tag.ToString().Split(',')[0]);
double y_hl = Convert.ToDouble(this.ellipsePixel_hl.Tag.ToString().Split(',')[1]);
Point point_hl = new Point(x_hl, y_hl);
System.Drawing.Bitmap bm_s = new System.Drawing.Bitmap(360, (int)this.pickerImage_s.Height);
for (int i = 0; i < 360; i++)
{
for (int j = 0; j < this.pickerImage_s.Height; j++)
{
bm_s.SetPixel(i, j, new HSLColor(255, (int)point_hl.X + 4, (i + 4) / 360.0, (point_hl.Y + 4) / 100.0).Color);
}
}
this.pickerImage_s.Source = ChangeBitmapToImageSource(bm_s);
HSLColor hc = new HSLColor();
hc.Hue = (int)point_hl.X + 4;
hc.Saturation = (point_s.X + 4) / 360.0;
hc.Lightness = (point_hl.Y + 4) / 100.0;
System.Drawing.Color co = hc.Color;
this.CurrentColor = hc.Color;
System.Windows.Media.Color c = new Color();
c.R = co.R;
c.G = co.G;
c.B = co.B;
c.A = 255;
if (ColorChanged != null && isLoaded)
{
ColorChanged(c); //触发事件
}
}
private void ChangePostion(System.Drawing.Color color)
{
try
{
HSLColor hsl = new HSLColor(color);
this.ellipsePixel_hl.SetValue(Canvas.LeftProperty, hsl.Hue > 352 ? 352 : hsl.Hue);
this.ellipsePixel_hl.SetValue(Canvas.TopProperty, hsl.Lightness > 0.91 ? 92 : hsl.Lightness * 100);
this.ellipsePixel_s.SetValue(Canvas.LeftProperty, hsl.Saturation > 0.96 ? 352 : hsl.Saturation * 360);
this.ellipsePixel_s.SetValue(Canvas.TopProperty, 6);
}
catch (Exception ex)
{
}
}
private System.Drawing.Color _currentColor = System.Drawing.Color.FromArgb(21, 160, 253);
public System.Drawing.Color CurrentColor
{
get { return _currentColor; }
set { _currentColor = value; }
}
public HSLColor CurrentHSL
{
get;
set;
}
private void CanvImage_sMouseDown(object sender, MouseButtonEventArgs e)
{
Point p = e.GetPosition((IInputElement)sender);
this.ellipsePixel_s.SetValue(Canvas.LeftProperty, p.X - 4);
this.ellipsePixel_s.SetValue(Canvas.TopProperty, p.Y - 4);
this.ellipsePixel_s.Tag = (p.X - 4) + "," + (p.Y - 4);
ChangeColor();
}
private void CanvImage_hlMouseDown(object sender, MouseButtonEventArgs e)
{
Point p = e.GetPosition((IInputElement)sender);
this.ellipsePixel_hl.SetValue(Canvas.LeftProperty, p.X - 4);
this.ellipsePixel_hl.SetValue(Canvas.TopProperty, p.Y - 4);
this.ellipsePixel_hl.Tag = (p.X - 4) + "," + (p.Y - 4);
ChangeColor();
}
private void SkinBtnClick(object sender, RoutedEventArgs e)
{
Button button = sender as Button;
object tag = button.Tag;
string imagePath = (string)tag;
if (SkinChanged != null && tag != null)
{
BitmapSource imageSource = null;
if (Regex.IsMatch(imagePath,"/.*?;"))
{
if (!imagePath.StartsWith("pack://application:,,,"))
{
imagePath = "pack://application:,,," + imagePath;
}
imageSource = new BitmapImage(new Uri(imagePath));
}
else
{
imagePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + imagePath;
FileStream fs = new FileStream(imagePath, FileMode.Open);
System.Drawing.Image img = System.Drawing.Image.FromStream(fs);
fs.Close();
var bitmap = new System.Drawing.Bitmap(img);
imageSource = ChangeBitmapToImageSource(bitmap);
}
SkinChanged(imageSource);
}
}
private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e)
{
if (OpacityChanged != null)
{
OpacityChanged(100 - (int)e.NewValue);
}
}
private void btnAddPicClick(object sender, RoutedEventArgs e)
{
//Microsoft.Win32.OpenFileDialog op = new Microsoft.Win32.OpenFileDialog();
//if(op.ShowDialog().Value)
//{
// MessageBox.Show("true");
//}
//else
//{
// MessageBox.Show("false");
//}
System.Windows.Forms.OpenFileDialog fb = new System.Windows.Forms.OpenFileDialog();
fb.ShowDialog();
}
}
}
珂珂的个人博客 - 一个程序猿的个人网站