namespace Yw.WpfUI.Hydro { /// /// 抽象选择辅助类 /// internal class LogicalSelectionHelper { /// /// /// public LogicalSelectionHelper(HelixViewport3D viewport) { _viewport = viewport; } /// /// 选择改变事件 /// public event Action> SelectionChangedEvent; /// /// 状态改变事件 /// public event Action StateChangedEvent; private readonly HelixViewport3D _viewport;//三维组件 /// /// 选择集合 /// public List Selection { get { return _selection; } private set { _selection = value; } } private List _selection = new(); #region 内部实现 //添加选择 private void AddToSelection(LogicalVisual3D visual) { if (_selection.Contains(visual)) { return; } _selection.Add(visual); this.StateChangedEvent?.Invoke(visual, true); } //从选择中移除 private void RemoveFromSelection(LogicalVisual3D visual) { if (!_selection.Contains(visual)) { return; } _selection.Remove(visual); this.StateChangedEvent?.Invoke(visual, false); } //清理选择 private void ClearSelection() { if (_selection.Count < 1) { return; } _selection.ForEach(x => this.StateChangedEvent?.Invoke(x, false)); _selection.Clear(); } #endregion /// /// 处理单个选择 /// public void HandleSingle(Point pt) { var logicalVisual = _viewport.FindNearestVisual(pt) as LogicalVisual3D; if (logicalVisual == null) { if (_selection.Count > 0) { ClearSelection(); this.SelectionChangedEvent?.Invoke(null); } return; } if (_selection.Count == 1 && _selection[0] == logicalVisual) { return; } ClearSelection(); AddToSelection(logicalVisual); this.SelectionChangedEvent?.Invoke(_selection); } /// /// 处理多个选择 /// public void HandleMulti(Point pt) { var logicalVisual = _viewport.FindNearestVisual(pt) as LogicalVisual3D; if (logicalVisual == null) { return; } if (_selection.Contains(logicalVisual)) { return; } AddToSelection(logicalVisual); this.SelectionChangedEvent?.Invoke(_selection); } /// /// 选择Visual /// 不触发选择改变事件 /// public void SelectVisual(LogicalVisual3D visual) { ClearSelection(); if (visual == null) { return; } AddToSelection(visual); } /// /// 选择Visuals /// public void SelectVisual(List visuals) { ClearSelection(); if (visuals == null || visuals.Count < 1) { return; } visuals.ForEach(AddToSelection); } } }