namespace Yw.WpfUI.Hydro { /// /// 选择管理器 /// internal class SimpleSelectionManager { /// /// /// public SimpleSelectionManager(HelixViewport3D viewport) { _viewport = viewport; } /// /// 选择改变事件 /// public event Action> SelectionChangedEvent; /// /// 状态改变事件 /// public event Action StateChangedEvent; private readonly HelixViewport3D _viewport;//控件 private readonly List _selection = new();//选择集合 #region 内部实现 //添加选择 private void AddToSelection(Visual3D visual) { if (_selection.Contains(visual)) { return; } _selection.Add(visual); this.StateChangedEvent?.Invoke(visual, eSelectionType.Load); } //从选择中移除 private void RemoveFromSelection(Visual3D visual) { if (!_selection.Contains(visual)) { return; } _selection.Remove(visual); this.StateChangedEvent?.Invoke(visual, eSelectionType.Unload); } //清理选择 private void ClearSelection() { if (_selection.Count < 1) { return; } _selection.ForEach(x => this.StateChangedEvent?.Invoke(x, eSelectionType.Unload)); _selection.Clear(); } #endregion /// /// 处理单个选择 /// public void HandleSingle(Point pt) { var visual = _viewport.FindNearestVisual(pt); if (visual == null) { if (_selection.Count > 0) { ClearSelection(); this.SelectionChangedEvent?.Invoke(null); } return; } if (_selection.Count == 1 && _selection[0] == visual) { return; } ClearSelection(); AddToSelection(visual); this.SelectionChangedEvent?.Invoke(_selection); } /// /// 处理多个选择 /// public void HandleMulti(Point pt) { var visual = _viewport.FindNearestVisual(pt); if (visual == null) { return; } if (_selection.Contains(visual)) { return; } AddToSelection(visual); this.SelectionChangedEvent?.Invoke(_selection); } /// /// 选择Visual /// 不触发选择改变事件 /// public void SelectVisual(Visual3D visual) { ClearSelection(); if (visual == null) { return; } AddToSelection(visual); } /// /// 选择Visuals /// public void SelectVisuals(List visuals) { ClearSelection(); if (visuals == null || visuals.Count < 1) { return; } visuals.ForEach(AddToSelection); } } }