using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using SparkClient.ViewModel.Grading; using GeometryModel3D = HelixToolkit.Wpf.SharpDX.GeometryModel3D; namespace SparkClient.Views.Grading; public partial class GradingResult { // List triangles = new List(); List mouseAddModels = new List(); // 用于记录当前所有已存在的Popup private List _allPopups = new List(); public GradingResult() { InitializeComponent(); // 在Window最外层捕获鼠标点击,判断是否点击在Popup之外,如果是则关闭所有Popup this.PreviewMouseLeftButtonDown += Window_PreviewMouseLeftButtonDown; //DataContext = new GradingResultVM(null); // this.Viewport3Dx.EffectsManager = new DefaultEffectsManager(); // this.Viewport3Dx.Camera = new PerspectiveCamera() // { // Position = new Point3D(0, 0, 5), // LookDirection = new Vector3D(0, 0, -1), // UpDirection = new Vector3D(0, 1, 0), // FarPlaneDistance = 1000, // NearPlaneDistance = 0.1 // }; // Loaded += (sender, args) => // { // var entities = Viewport3DHelper.InitDemo(Viewport3Dx); // triangles.AddRange(entities); // }; } /// /// 点击模型 /// /// /// private void Viewport3Dx_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { // // 获取鼠标点击位置 // var mousePosition = e.GetPosition(Viewport3Dx); // // // 查找鼠标点击的 3D 对象 // var hits = Viewport3Dx.FindHits(mousePosition); // // // 如果没有命中任何 3D 对象 // if (hits == null || hits.Count == 0) // { // Console.WriteLine("未点击到任何模型"); // foreach (var item in mouseAddModels) // { // Viewport3Dx.Items.Remove(item); // } // mouseAddModels.Clear(); // return; // } // // // 获取第一个命中的对象 // var hit = hits[0]; // // // 检查是否是 MeshGeometryModel3D // if (hit.ModelHit is MeshGeometryModel3D modelHit) // { // foreach (var item in mouseAddModels) // { // Viewport3Dx.Items.Remove(item); // } // mouseAddModels.Clear(); // // 获取几何信息 // var geometry = modelHit.Geometry as MeshGeometry3D; // if (geometry != null) // { // // 获取命中的三角形索引 // var triangleIndex = hit.TriangleIndices; // // // 获取三角形顶点 // var vertex1 = geometry.Positions[triangleIndex.Item1]; // var vertex2 = geometry.Positions[triangleIndex.Item2]; // var vertex3 = geometry.Positions[triangleIndex.Item3]; // // string strPoint = vertex1.X + ","+ vertex1.Y+","+ vertex1.Z + ";"+ vertex2.X + ","+ vertex2.Y + ","+ vertex2.Z+";"+vertex3.X + ","+ vertex3.Y + ","+ vertex3.Z; // string triangleCode = Viewport3DTriangleEntity.GenerateMD5Hash(strPoint); // // //命中实体 // Viewport3DTriangleEntity res = triangles.Find(e => triangleCode.Equals(e.TriangleCode)); // // if (res == null) // return; // // //命中面 // List facet = triangles.Where(e => res.PlaneCode.Equals(e.PlaneCode)).ToList(); // var colorFacet = new Color4(1.0f, 1.0f, 0.0f, 1.0f); // var data1 = Viewport3DHelper.GenerateEmissiveModelByEntity(Viewport3Dx,facet,colorFacet); // mouseAddModels.AddRange(data1); // //命中面标线 // var data2 = Viewport3DHelper.GenerateLineTextModelByEntity(Viewport3Dx, facet); // mouseAddModels.AddRange(data2); // //命中同类面 // List facetType = triangles.Where(e => res.PlaneType.Equals(e.PlaneType)).ToList(); // //排除自己 // facet.ForEach(e=>facetType.Remove(e)); // var colorFacetType = new Color4(0.9f, 0.9f, 0.7f, 1.0f); // var data3 = Viewport3DHelper.GenerateEmissiveModelByEntity(Viewport3Dx,facetType,colorFacetType); // mouseAddModels.AddRange(data3); // } // } // else // { // Console.WriteLine("点击的对象不是 MeshGeometryModel3D"); // } } private void ChangSymLevel(object sender, SelectionChangedEventArgs e) { var d = DataContext as GradingResultVM; d.ChangeSym(null); } // private void dataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) // { // detailPopup.IsOpen = false; // // 获取点击的目标元素 // var element = sender as FrameworkElement; // // var cell = FindVisualParent(element); // if (cell == null) return; // // var row = FindVisualParent(cell); // if (row == null) return; // // if (element != null) // { // // 将 firstCell 的边界转换为屏幕坐标系 // var firstCellBounds = cell.PointToScreen(new Point(0, 0)); // // // 计算Popup的位置 // var popupPosition = new Point(firstCellBounds.X + cell.RenderSize.Width, firstCellBounds.Y + cell.RenderSize.Height); // var selectObject = row.Item as DataInfo; // string testItemId = selectObject.TestItemId; // var d = DataContext as GradingResultVM; // RowDetail rowDetail = d.getSelectData(testItemId); // // 设置Popup的位置 // detailPopup.HorizontalOffset = popupPosition.X; // detailPopup.VerticalOffset = popupPosition.Y; // detailPopup.IsOpen = true; // RowDetail.Items.Clear(); // RowDetail.Items.Add(rowDetail); // } // } // 辅助方法:查找父元素 private T FindVisualParent(DependencyObject child) where T : DependencyObject { var parentObject = VisualTreeHelper.GetParent(child); if (parentObject == null) return null; if (parentObject is T parent) { return parent; } else { return FindVisualParent(parentObject); } } // private void Window_MouseDown(object sender, MouseButtonEventArgs e) // { // detailPopup.IsOpen = false; // } // // private void Window_MouseDown(object sender, RoutedEventArgs e) // { // detailPopup.IsOpen = false; // } private void ClickArea_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { var border = sender as Border; if (border == null) return; var parentGrid = border.Parent as Grid; if (parentGrid == null) return; var popup = parentGrid.FindName("RowPopup") as Popup; if (popup == null) return; popup.DataContext = this.DataContext; // 先关闭所有已显示的 Popup CloseAllPopups(); var oo = FindVisualParent(parentGrid); if(oo == null) return; var d = DataContext as GradingResultVM; RowDetail rowDetail = d.getSelectData((oo.Item as DataInfo).TestItemId); if (!_allPopups.Contains(popup)) { _allPopups.Add(popup); } // 显示新Popup popup.IsOpen = true; popup.Visibility = Visibility.Visible; } private void CloseAllPopups() { foreach (var p in _allPopups) { p.IsOpen = false; p.Visibility = Visibility.Collapsed; } } private void CloseAllPopup_Click(object sender, RoutedEventArgs e) { CloseAllPopups(); } private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { // originalSource 是点击处的控件 var clickedElement = e.OriginalSource as DependencyObject; // 遍历所有已知 Popup bool isClickOnAnyPopup = false; foreach (var p in _allPopups) { // 如果此 Popup 不可见或未打开,就不用检查了 if (!p.IsOpen) continue; // 判断点击处是否在此 Popup 内 if (IsDescendantOf(p.Child, clickedElement)) { // 找到一个 Popup 包含这个点击 isClickOnAnyPopup = true; break; } } // 如果没点击到任何 Popup,就关闭全部 if (!isClickOnAnyPopup) { CloseAllPopups(); } } private bool IsDescendantOf(DependencyObject parent, DependencyObject clicked) { if (parent == null || clicked == null) return false; // 从 clicked 开始不断向上找 VisualTree var current = clicked; while (current != null) { if (current == parent) { return true; } current = VisualTreeHelper.GetParent(current); } return false; } private void UIElement_OnMouseLeave(object sender, MouseEventArgs e) { if (sender is Image image) { image.Source = new BitmapImage(new Uri(@"pack://application:,,,/Resource/Images/UIResource/01-8.png")); } } private void UIElement_OnMouseEnter(object sender, MouseEventArgs e) { if (sender is Image image) { image.Source = new BitmapImage(new Uri(@"pack://application:,,,/Resource/Images/UIResource/01-8-1.png")); } } }