Следующий класс (PanImage) является адаптацией класса ZoomBorder из этой темы здесь Pan & Zoom Image .Поскольку мне нужно закрасить изображение, я не могу использовать рамку.Когда PanImage перемещается с помощью левой кнопки мыши, а кнопка все еще нажата, изображение перемещается назад и вперед между двумя положениями.Почему это происходит и как я могу исправить это поведение?
using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
class PanImage : Image
{
public PanImage()
{
// add event-handler for changes of the SourceProperty of the Image class
DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(Image.SourceProperty, typeof(Image));
dpd?.AddValueChanged(this, delegate { Initialize(); });
}
private Point _origin;
private Point _start;
private TranslateTransform GetTranslateTransform()
{
return (TranslateTransform)((TransformGroup)RenderTransform)
.Children.First(tr => tr is TranslateTransform);
}
private ScaleTransform GetScaleTransform()
{
return (ScaleTransform)((TransformGroup)RenderTransform)
.Children.First(tr => tr is ScaleTransform);
}
public void Initialize()
{
RenderOptions.SetBitmapScalingMode(this, BitmapScalingMode.NearestNeighbor);
TransformGroup group = new TransformGroup();
ScaleTransform st = new ScaleTransform();
TranslateTransform tt = new TranslateTransform();
group.Children.Add(st);
group.Children.Add(tt);
RenderTransform = group;
RenderTransformOrigin = new Point(0.0, 0.0);
MouseLeftButtonDown += handle_MouseLeftButtonDown;
MouseLeftButtonUp += handle_MouseLeftButtonUp;
MouseMove += handle_MouseMove;
PreviewMouseRightButtonDown += handle_PreviewMouseRightButtonDown;
}
public void Reset()
{
// reset zoom
var st = GetScaleTransform();
st.ScaleX = 1.0;
st.ScaleY = 1.0;
// reset pan
var tt = GetTranslateTransform();
tt.X = 0.0;
tt.Y = 0.0;
}
private void handle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var tt = GetTranslateTransform();
_start = e.GetPosition(this);
_origin = new Point(tt.X, tt.Y);
Cursor = Cursors.Hand;
CaptureMouse();
}
private void handle_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
ReleaseMouseCapture();
Cursor = Cursors.Arrow;
}
void handle_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
Reset();
}
private void handle_MouseMove(object sender, MouseEventArgs e)
{
if (IsMouseCaptured)
{
Vector v = _start - e.GetPosition(this);
var tt = GetTranslateTransform();
tt.X = _origin.X - v.X;
tt.Y = _origin.Y - v.Y;
}
}
}