<ItemsControl x:Name="DiagramDesignerCanvasContainer"
Width="300" Height="300" ClipToBounds="true"
Background="Yellow" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Width="200" Height="200" HorizontalAlignment="Left" VerticalAlignment="Top"
Loaded="Canvas_Loaded" >
<Canvas.Background>
<LinearGradientBrush>
<GradientStop Color="LightBlue" Offset="0" />
<GradientStop Color="Green" Offset="1" />
</LinearGradientBrush>
</Canvas.Background>
</Canvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<TextBlock Text="Test" Canvas.Left="50" Canvas.Top="50" Foreground="Red" FontWeight="Bold" FontSize="50"/>
</ItemsControl>
namespace WpfApp1
{
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Canvas_Loaded(object sender, RoutedEventArgs e)
{
tool = new MouseZoomMoveTool((Canvas)sender);
}
MouseZoomMoveTool tool;
}
class MouseZoomMoveTool
{
private UIElement element;
private Point dragStartPoint;
private System.Windows.Media.Matrix dragMatrix;
public MouseZoomMoveTool(UIElement element)
{
this.element = element;
DependencyObject d = element;
while (d != null)
{
d = VisualTreeHelper.GetParent(d);
if (d is Control control)
{
if (control.Background is null)
{
control.Background = Brushes.Transparent;
}
control.MouseWheel += Control_MouseWheel;
control.MouseLeftButtonDown += Control_MouseLeftButtonDown;
break;
}
}
}
private void Control_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
var c = (Control)sender;
if (c.CaptureMouse())
{
c.MouseMove += Control_MouseMove;
c.MouseLeftButtonUp += Control_MouseLeftButtonUp;
this.dragStartPoint = e.GetPosition(c);
this.dragMatrix = GetMatrixTransform().Matrix;
e.Handled = true;
}
}
private void Control_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
var control = (Control)sender;
MatrixTransform mt = GetMatrixTransform();
var p2 = e.GetPosition(control);
var matrix = dragMatrix;
var x = (p2.X - dragStartPoint.X) * matrix.M11;
var y = (p2.Y - dragStartPoint.Y) * matrix.M11;
matrix.Translate(x, y);
mt.Matrix = matrix;
e.Handled = true;
}
private void Control_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
var control = (Control)sender;
control.ReleaseMouseCapture();
control.MouseMove -= Control_MouseMove;
control.MouseUp -= Control_MouseLeftButtonUp;
e.Handled = true;
}
private void Control_MouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs me)
{
var control = (Control)sender;
if (control.IsMouseCaptured)
{
return;
}
MatrixTransform mt = GetMatrixTransform();
var p = me.GetPosition(this.element);
var matrix = mt.Matrix;
double scaleCurrent = matrix.M11;
double scaleDelta = (me.Delta > 0) ? 0.95 : 1.05;
var p2 = matrix.Transform(new Point(0, 0));
var centerX = scaleCurrent * p.X + p2.X;
var centerY = scaleCurrent * p.Y + p2.Y;
matrix.ScaleAt(scaleDelta, scaleDelta, centerX, centerY);
mt.Matrix = matrix;
me.Handled = true;
}
private MatrixTransform GetMatrixTransform()
{
if (!(element.RenderTransform is MatrixTransform mt) || mt.IsFrozen)
{
mt = new MatrixTransform();
element.RenderTransform = mt;
}
return mt;
}
}
}