PolygonRoiCanvas: ROI右键删除顶点阻止菜单弹出、IsEditable属性控制编辑状态

This commit is contained in:
李伟
2026-04-28 17:38:21 +08:00
parent 9d059709bd
commit 8b2cf01fe2
2 changed files with 40 additions and 2 deletions
@@ -1947,14 +1947,44 @@ namespace XP.ImageProcessing.RoiControl.Controls
// BGA 模式下阻止 ContextMenu 弹出 // BGA 模式下阻止 ContextMenu 弹出
if (CurrentMeasureMode == Models.MeasureMode.BgaVoid && _bgaCurrent != null) if (CurrentMeasureMode == Models.MeasureMode.BgaVoid && _bgaCurrent != null)
{ {
SuppressContextMenu = true;
e.Handled = true; e.Handled = true;
} }
// 外部请求抑制右键菜单
if (SuppressContextMenu)
{
e.Handled = true;
}
// ROI 选中状态下,右键点击顶点附近时删除顶点并阻止菜单
if (SelectedROI is PolygonROI poly && poly.IsSelected && poly.IsEditable && poly.Points.Count > 3)
{
var pos = e.GetPosition(mainCanvas);
double threshold = 15;
int nearestIndex = -1;
double nearestDist = double.MaxValue;
for (int i = 0; i < poly.Points.Count; i++)
{
var pt = poly.Points[i];
double dx = pt.X - pos.X, dy = pt.Y - pos.Y;
double dist = Math.Sqrt(dx * dx + dy * dy);
if (dist < nearestDist) { nearestDist = dist; nearestIndex = i; }
}
if (nearestIndex >= 0 && nearestDist < threshold)
{
poly.Points.RemoveAt(nearestIndex);
SuppressContextMenu = true;
e.Handled = true;
}
}
} }
/// <summary>设置为 true 可抑制下一次右键菜单弹出,由外部(如 ViewportPanelView)在 ContextMenuOpening 中检查</summary>
public bool SuppressContextMenu { get; set; }
private void ROI_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) private void ROI_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{ {
// 选择ROI // 选择ROI(仅可编辑时)
if (sender is FrameworkElement element && element.DataContext is ROIShape roi) if (sender is FrameworkElement element && element.DataContext is ROIShape roi && roi.IsEditable)
{ {
SelectedROI = roi; SelectedROI = roi;
e.Handled = true; e.Handled = true;
@@ -21,6 +21,7 @@ namespace XP.ImageProcessing.RoiControl.Models
public abstract class ROIShape : INotifyPropertyChanged public abstract class ROIShape : INotifyPropertyChanged
{ {
private bool _isSelected; private bool _isSelected;
private bool _isEditable = true;
private string _id = Guid.NewGuid().ToString(); private string _id = Guid.NewGuid().ToString();
private string _color = "Red"; private string _color = "Red";
@@ -36,6 +37,13 @@ namespace XP.ImageProcessing.RoiControl.Models
set { _isSelected = value; OnPropertyChanged(); } set { _isSelected = value; OnPropertyChanged(); }
} }
/// <summary>是否可编辑(拖拽顶点、删除顶点)</summary>
public bool IsEditable
{
get => _isEditable;
set { _isEditable = value; OnPropertyChanged(); }
}
public string Color public string Color
{ {
get => _color; get => _color;