diff --git a/XplorePlane/Views/Main/ViewportPanelView.xaml b/XplorePlane/Views/Main/ViewportPanelView.xaml
index df7bd71..93561c1 100644
--- a/XplorePlane/Views/Main/ViewportPanelView.xaml
+++ b/XplorePlane/Views/Main/ViewportPanelView.xaml
@@ -41,8 +41,20 @@
-
+ Background="White">
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/XplorePlane/Views/Main/ViewportPanelView.xaml.cs b/XplorePlane/Views/Main/ViewportPanelView.xaml.cs
index 48fa099..6b129a4 100644
--- a/XplorePlane/Views/Main/ViewportPanelView.xaml.cs
+++ b/XplorePlane/Views/Main/ViewportPanelView.xaml.cs
@@ -1,11 +1,14 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
+using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
+using System.Windows.Media.Imaging;
using System.Windows.Shapes;
+using Microsoft.Win32;
using XP.ImageProcessing.RoiControl.Controls;
using XplorePlane.Events;
using XplorePlane.ViewModels;
@@ -204,10 +207,12 @@ namespace XplorePlane.Views
StrokeThickness = 1.5,
Cursor = Cursors.Hand
};
+ // 禁止测量点上弹出右键菜单
+ dot.SetValue(ContextMenuService.IsEnabledProperty, false);
dot.MouseLeftButtonDown += Dot_Down;
dot.MouseMove += Dot_Move;
dot.MouseLeftButtonUp += Dot_Up;
- dot.MouseRightButtonDown += Dot_RightClick;
+ dot.PreviewMouseRightButtonUp += Dot_RightClick;
return dot;
}
@@ -320,5 +325,81 @@ namespace XplorePlane.Views
}
#endregion
+
+ #region 右键菜单
+
+ private void ZoomIn_Click(object sender, RoutedEventArgs e) => RoiCanvas.ZoomScale = Math.Min(10.0, RoiCanvas.ZoomScale * 1.2);
+ private void ZoomOut_Click(object sender, RoutedEventArgs e) => RoiCanvas.ZoomScale = Math.Max(0.1, RoiCanvas.ZoomScale / 1.2);
+ private void ResetView_Click(object sender, RoutedEventArgs e) => RoiCanvas.ResetView();
+
+ private void ClearAllMeasurements_Click(object sender, RoutedEventArgs e)
+ {
+ if (_measureOverlay != null)
+ {
+ _measureOverlay.Children.Clear();
+ _groups.Clear();
+ }
+ _pendingDot = null;
+ _pendingPoint = null;
+
+ if (DataContext is ViewportPanelViewModel vm)
+ {
+ vm.ResetMeasurementState();
+ vm.ImageInfo = "已清除所有测量";
+ }
+ }
+
+ private void SaveOriginalImage_Click(object sender, RoutedEventArgs e)
+ {
+ if (DataContext is not ViewportPanelViewModel vm || vm.ImageSource is not BitmapSource bitmap)
+ {
+ MessageBox.Show("当前没有可保存的图像", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
+ return;
+ }
+ SaveBitmapToFile(bitmap, "保存原始图像");
+ }
+
+ private void SaveResultImage_Click(object sender, RoutedEventArgs e)
+ {
+ // 截取整个图像区域(含测量标注覆盖层)
+ var target = FindChildByName