using Bro.Common.ImageCanvas.Shapes;
using System.Collections.ObjectModel;
using System.Drawing;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Input;
namespace Bro.Common.ImageCanvas
{
///
/// ImageCanvas.xaml 的交互逻辑
///
public partial class ImageCanvas : System.Windows.Controls.UserControl
{
bool isFirstLoad = true;
public ImageCanvas()
{
InitializeComponent();
GotFocus += (sender, args) => Keyboard.Focus(ZoomAndPanControl);
Loaded += (s, e) => { isFirstLoad = true; };
_infoClearTimer = new System.Threading.Timer(ClearInfo, null, Timeout.Infinite, Timeout.Infinite);
ZoomAndPanControl.OnMousePositionChanged += OnMousePointChanged;
}
#region ImageSource
public static readonly DependencyProperty ImageSourceProperty = DependencyProperty.Register("ImageSource", typeof(Bitmap), typeof(ImageCanvas), new PropertyMetadata(new Bitmap(1000, 1000), OnImagSourcePropertyChanged));
public Bitmap ImageSource
{
get => GetValue(ImageSourceProperty) as Bitmap;
set => SetValue(ImageSourceProperty, value);
}
private static void OnImagSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ImageCanvas ctrl = d as ImageCanvas;
if (ctrl != null)
{
Bitmap map = e.NewValue as Bitmap;
if (map != null)
{
ctrl.actualContent.Source = map.BitmapToWriteableBitmap();
if (ctrl.isFirstLoad)
{
ctrl.isFirstLoad = false;
Task.Run(() =>
{
Thread.Sleep(100);
ctrl.Dispatcher.Invoke(() =>
{
ctrl.ZoomAndPanControl.FitCommand?.Execute(null);
});
});
}
}
}
}
#endregion
#region ToolBar
public static readonly DependencyProperty IsShowToolBarProperty = DependencyProperty.Register("IsShowToolBar", typeof(bool), typeof(ImageCanvas), new PropertyMetadata(true, OnIsShowToolBarPropertyChanged));
private static void OnIsShowToolBarPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ImageCanvas ctrl = d as ImageCanvas;
if (ctrl != null)
{
bool isVisible = (bool)e.NewValue;
ctrl.toolBarTray.Visibility = isVisible ? Visibility.Visible : Visibility.Collapsed;
}
}
public bool IsShowToolBar
{
get => (bool)GetValue(IsShowToolBarProperty);
set => SetValue(IsShowToolBarProperty, value);
}
private void btnOpenFile_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Multiselect = false;
if (ofd.ShowDialog() == DialogResult.OK)
{
Bitmap map = System.Drawing.Image.FromFile(ofd.FileName) as Bitmap;
if (map != null)
{
ImageSource = map;
}
}
}
private void btnSaveImage_Click(object sender, RoutedEventArgs e)
{
if (ImageSource == null)
return;
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "JPG文件|*.jpg|BMP文件|*.bmp";
if (sfd.ShowDialog() == DialogResult.OK)
{
string filePath = sfd.FileName;
if (filePath.EndsWith("bmp"))
{
ImageSource.Save(filePath, System.Drawing.Imaging.ImageFormat.Bmp);
}
else
{
ImageSource.Save(filePath, System.Drawing.Imaging.ImageFormat.Jpeg);
}
SetTxtInfo($"图片保存成功! {filePath}");
}
}
private void btnSaveImageResults_Click(object sender, RoutedEventArgs e)
{
}
private void btnFitScreen_Click(object sender, RoutedEventArgs e)
{
ZoomAndPanControl.FitCommand?.Execute(null);
}
private void btnOriginImage_Click(object sender, RoutedEventArgs e)
{
ZoomAndPanControl.FillCommand?.Execute(null);
}
#endregion
#region Visula Shapes
public static readonly DependencyProperty ShapeListProperty =
DependencyProperty.Register("ShapeList", typeof(ObservableCollection), typeof(ImageCanvas), new PropertyMetadata(new ObservableCollection(), ObservableCollectionChangedCallback));
private static void ObservableCollectionChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var canvas = (ImageCanvas)d;
//canvas.visualCanvas.VisualList = new ObservableCollection(canvas.ShapeList);
//canvas.ShapeList.CollectionChanged += canvas.Shapes_CollectionChanged;
canvas.visualCanvas.VisualList = canvas.ShapeList;
}
public ObservableCollection ShapeList
{
get => GetValue(ShapeListProperty) as ObservableCollection;
set
{
SetValue(ShapeListProperty, value);
//value.CollectionChanged -= Shapes_CollectionChanged;
//value.CollectionChanged += Shapes_CollectionChanged;
}
}
//private void Shapes_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
//{
// //this.visualCanvas.VisualList = new ObservableCollection(this.ShapeList);
//}
#endregion
#region txtInfo
readonly System.Threading.Timer _infoClearTimer = null;
private void ClearInfo(object state)
{
txtInfo.Dispatcher.Invoke(() =>
{
txtInfo.Text = "";
});
}
private void SetTxtInfo(string info)
{
txtInfo.Text = info;
if (!string.IsNullOrWhiteSpace(info))
{
_infoClearTimer.Change(5000, Timeout.Infinite);
}
}
#endregion
#region MousePoint
private void OnMousePointChanged(System.Windows.Point point)
{
visualCanvas.OnMousePointChanged(point);
}
#endregion
}
}