右键拖动画布

This commit is contained in:
艾竹
2023-03-12 15:26:58 +08:00
parent fb7858fe74
commit e2753b0bff
16 changed files with 711 additions and 142 deletions

View File

@@ -188,10 +188,16 @@ namespace AIStudio.Wpf.DiagramDesigner
public DesignerCanvas()
{
this.AllowDrop = true;
this.Focusable = true;
Mediator.Instance.Register(this);
_service.PropertyChanged += _service_PropertyChanged;
this.Loaded += DesignerCanvas_Loaded;
}
private void DesignerCanvas_Loaded(object sender, RoutedEventArgs e)
{
this.Focus();
}
protected override void OnRender(DrawingContext dc)
@@ -322,9 +328,12 @@ namespace AIStudio.Wpf.DiagramDesigner
protected override void OnMouseDown(MouseButtonEventArgs e)
{
base.OnMouseDown(e);
base.OnMouseDown(e);
if (_viewModel.IsReadOnly) return;
this.Focus();
if (_service.DrawModeViewModel.CursorMode == CursorMode.Format)
{
var element = (e.OriginalSource as FrameworkElement);
@@ -356,7 +365,7 @@ namespace AIStudio.Wpf.DiagramDesigner
_viewModel.ClearSelectedItemsCommand.Execute(null);
}
e.Handled = true;
//e.Handled = true;
if (_service.DrawModeViewModel.GetDrawMode() == DrawMode.ConnectingLineSmooth)
{
@@ -435,7 +444,7 @@ namespace AIStudio.Wpf.DiagramDesigner
}
}
}
e.Handled = true;
//e.Handled = true;
}
protected override void OnMouseUp(MouseButtonEventArgs e)
@@ -499,7 +508,33 @@ namespace AIStudio.Wpf.DiagramDesigner
sourceConnectorInfo = null;
_service.DrawModeViewModel.ResetDrawMode();
}
}
protected override void OnPreviewKeyDown(KeyEventArgs e)
{
base.OnPreviewKeyDown(e);
if (_viewModel.IsReadOnly) return;
e.Handled = _viewModel.ExecuteShortcut(e);
}
protected override void OnPreviewMouseWheel(MouseWheelEventArgs e)
{
base.OnPreviewMouseWheel(e);
if (Keyboard.IsKeyDown(Key.LeftCtrl) == false
&& Keyboard.IsKeyDown(Key.RightCtrl) == false)
{
return;
}
var newZoomValue = _viewModel.ZoomValue + (e.Delta > 0 ? 0.1 : -0.1);
_viewModel.ZoomValue = Math.Max(Math.Min(newZoomValue, _viewModel.MaximumZoomValue), _viewModel.MinimumZoomValue);
e.Handled = true;
}
protected override Size MeasureOverride(Size constraint)
{
@@ -555,7 +590,7 @@ namespace AIStudio.Wpf.DiagramDesigner
{
base.OnDrop(e);
if (_viewModel.IsReadOnly) return;
if (_viewModel.IsReadOnly) return;
DragObject dragObject = e.Data.GetData(typeof(DragObject)) as DragObject;
if (dragObject != null)
@@ -620,7 +655,7 @@ namespace AIStudio.Wpf.DiagramDesigner
_viewModel.AddItemCommand.Execute(itemBase);
}
}
e.Handled = true;
e.Handled = true;
}
public FullyCreatedConnectorInfo FindNearPortToAttachTo()

View File

@@ -1,9 +1,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
@@ -23,6 +21,8 @@ namespace AIStudio.Wpf.DiagramDesigner.Controls
private bool drag;
private void DragThumb_DragStarted(object sender, DragStartedEventArgs e)
{
GetDesignerCanvas(this)?.Focus();
drag = false;
SelectableDesignerItemViewModelBase designerItem = this.DataContext as SelectableDesignerItemViewModelBase;

View File

@@ -5,6 +5,7 @@ using System.Windows.Controls.Primitives;
using System.Windows.Media;
using System.Windows.Input;
using AIStudio.Wpf.DiagramDesigner.Helpers;
using System.Diagnostics;
namespace AIStudio.Wpf.DiagramDesigner
{
@@ -67,17 +68,20 @@ namespace AIStudio.Wpf.DiagramDesigner
{
if (oldDesignerCanvas != null)
{
oldDesignerCanvas.LayoutUpdated -= new EventHandler(this.DesignerCanvas_LayoutUpdated);
oldDesignerCanvas.MouseWheel -= new MouseWheelEventHandler(this.DesignerCanvas_MouseWheel);
oldDesignerCanvas.LayoutUpdated -= this.DesignerCanvas_LayoutUpdated;
oldDesignerCanvas.MouseDown -= this.DesignerCanvas_MouseRightButtonDown;
oldDesignerCanvas.MouseUp -= this.DesignerCanvas_MouseRightButtonUp;
oldDesignerCanvas.MouseMove -= this.DesignerCanvas_MouseMove;
}
if (newDesignerCanvas != null)
{
newDesignerCanvas.LayoutUpdated += new EventHandler(this.DesignerCanvas_LayoutUpdated);
newDesignerCanvas.MouseWheel += new MouseWheelEventHandler(this.DesignerCanvas_MouseWheel);
newDesignerCanvas.LayoutUpdated += this.DesignerCanvas_LayoutUpdated;
newDesignerCanvas.MouseRightButtonDown += this.DesignerCanvas_MouseRightButtonDown;
newDesignerCanvas.MouseRightButtonUp += this.DesignerCanvas_MouseRightButtonUp;
newDesignerCanvas.MouseMove += this.DesignerCanvas_MouseMove;
}
}
#endregion
public static readonly DependencyProperty OffSetProperty =
@@ -182,7 +186,6 @@ namespace AIStudio.Wpf.DiagramDesigner
private void DesignerCanvas_LayoutUpdated(object sender, EventArgs e)
{
//htzk
try
{
@@ -194,22 +197,41 @@ namespace AIStudio.Wpf.DiagramDesigner
Canvas.SetTop(this.zoomThumb, yOffset + this.ScrollViewer.VerticalOffset * scale);
}
catch { }
}
/// <summary>
/// 用于记录鼠标按下的点
/// </summary>
private Point _clickPoint = new Point(0, 0);
private void DesignerCanvas_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
_clickPoint = e.GetPosition((FrameworkElement)sender);
Debug.WriteLine($"({_clickPoint.X},{_clickPoint.Y})");
DesignerCanvas.Cursor = Cursors.Hand;
}
private void DesignerCanvas_MouseWheel(object sender, EventArgs e)
private void DesignerCanvas_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
if (Keyboard.IsKeyDown(Key.LeftCtrl) == false
&& Keyboard.IsKeyDown(Key.RightCtrl) == false)
DesignerCanvas.Cursor = Cursors.Arrow;
}
private void DesignerCanvas_MouseMove(object sender, MouseEventArgs e)
{
if (e.RightButton == MouseButtonState.Pressed)
{
return;
FrameworkElement cabSender = (FrameworkElement)sender;
//_clickPoint=new Point(scroll.ActualWidth/2,scroll.ActualHeight/2);
double x;
double y;
Point p = e.MouseDevice.GetPosition(cabSender);
x = _clickPoint.X - p.X;
y = _clickPoint.Y - p.Y;
ScrollViewer?.ScrollToHorizontalOffset(ScrollViewer.HorizontalOffset + x);
ScrollViewer?.ScrollToVerticalOffset(ScrollViewer.VerticalOffset + y);
}
MouseWheelEventArgs wheel = (MouseWheelEventArgs)e;
//divide the value by 10 so that it is more smooth
double value = Math.Max(0, wheel.Delta / 10);
value = Math.Min(wheel.Delta, 10);
this.zoomSlider.Value += value;
}
private void InvalidateScale(out double scale, out double xOffset, out double yOffset)