using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Messaging;
using LiveCharts;
using LiveCharts.Wpf;
using MathNet.Numerics.LinearAlgebra.Double;
using Microsoft.Win32;
//using MathNet.Numerics.LinearAlgebra.Complex;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApp2
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
Point previousPoint;
bool isTranslateStart = false;
public MainWindow()
{
InitializeComponent();
}
private void outsidewrapper_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if (e.MiddleButton == MouseButtonState.Pressed && e.LeftButton == MouseButtonState.Released && e.RightButton == MouseButtonState.Released)
{
previousPoint = e.GetPosition(outside);
isTranslateStart = true;
}
e.Handled = true;
}
private void outsidewrapper_PreviewMouseMove(object sender, MouseEventArgs e)
{
if (e.MiddleButton == MouseButtonState.Pressed && e.LeftButton == MouseButtonState.Released && e.RightButton == MouseButtonState.Released)
{
if (isTranslateStart)
{
Point currentPoint = e.GetPosition(outside); //不能用 inside,必须用outside
System.Windows.Vector v = currentPoint - previousPoint;
TransformGroup tg = inside.RenderTransform as TransformGroup;
tg.Children.Add(new TranslateTransform(v.X, v.Y)); //centerX和centerY用外部包装元素的坐标,不能用内部被变换的Canvas元素的坐标
previousPoint = currentPoint;
}
}
e.Handled = true;
}
private void outside_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
if (e.MiddleButton == MouseButtonState.Pressed && e.LeftButton == MouseButtonState.Released && e.RightButton == MouseButtonState.Released)
{
if (isTranslateStart)
{
isTranslateStart = false;
}
}
e.Handled = true;
}
private void outside_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
Point currentPoint = e.GetPosition(outside); //不能用 inside,必须用outside
TransformGroup tg = inside.RenderTransform as TransformGroup;
double s = ((double)e.Delta) / 1000.0 + 1.0;
if (myImage.Height * tg.Value.M22 < 200 || myImage.Width * tg.Value.M11 < 200)
{
if(s > 1.0)//当图像像素宽度和高度小于200的时候只能放大,不再缩小
tg.Children.Add(new ScaleTransform(s, s, currentPoint.X, currentPoint.Y));
}
else
tg.Children.Add(new ScaleTransform(s, s, currentPoint.X, currentPoint.Y));
e.Handled = true;
}
private void BtnClickLoadPic(object sender, RoutedEventArgs e)
{
// Instantiate the dialog box
var dlg = new Microsoft.Win32.OpenFileDialog
{
FileName = "",
Filter = "All Files|*.*|PNG Files|*.png|JPG Files|*.jpg|TIF Files|*.tif"
};
var result = dlg.ShowDialog();
// Process open file dialog box results
if (result == true)
{
BitmapImage bitmapImage = new BitmapImage(new Uri(dlg.FileName));
myImage.Source = bitmapImage;
myImage.Height = bitmapImage.PixelHeight;//为了得到像素对应的坐标
myImage.Width = bitmapImage.PixelWidth;//为了得到像素对应的坐标
}
}
private void BtnClickFullScreen(object sender, RoutedEventArgs e)
{
TransformGroup tg = inside.RenderTransform as TransformGroup;
System.Windows.Media.Matrix value = new System.Windows.Media.Matrix();
value.M11 = outside.ActualWidth / myImage.Width / tg.Value.M11;//缩放倍数为Border的尺寸
value.M22 = outside.ActualHeight / myImage.Height / tg.Value.M22;
value.OffsetX = (0 - tg.Value.OffsetX) * value.M11;//调整偏移XY到(0,0)
value.OffsetY = (0 - tg.Value.OffsetY) * value.M22;
MatrixTransform matrixTransform = new MatrixTransform(value);//添加矩阵变换
tg.Children.Add(matrixTransform);
e.Handled = true;
}
}
}