using Aurora; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; using VisionCommon; using VisionCommonUI; using VisionUI; namespace WeldingCommon.Views { /// /// Interaction logic for WDSelectScoutField.xaml /// public partial class WDSelectScoutField : Window { public WDSelectScoutField(IAuroraEnvironment aurora) { InitializeComponent(); var viewmodel = new WDSelectScoutFieldViewModel(aurora); DataContext = viewmodel; viewmodel.RequestClose += () => Close(); } // 마우스 드래그 시작 위치 public class RectangleAdorner : Adorner { private Point? mStartPoint; private Point? mEndPoint; private readonly Pen mPen; public RectangleAdorner(UIElement adornedElement) : base(adornedElement) { mPen = new Pen(Brushes.Red, 1) { DashStyle = DashStyles.Dash }; } public void Start(Point startPoint) { this.mStartPoint = startPoint; this.InvalidateVisual(); } public void Update(Point endPoint) { this.mEndPoint = endPoint; this.InvalidateVisual(); } public void Stop() { this.mStartPoint = null; this.mEndPoint = null; this.InvalidateVisual(); } protected override void OnRender(DrawingContext drawingContext) { if (this.mStartPoint.HasValue && this.mEndPoint.HasValue) { var rect = new Rect(this.mStartPoint.Value, this.mEndPoint.Value); drawingContext.DrawRectangle(null, mPen, rect); } } } // 마우스 드래그 시작 위치 Point? _DragStart = null; // ListBox에서 마우스 이벤트 처리 private void ListBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { var listBox = (ListBox)sender; var adornerLayer = AdornerLayer.GetAdornerLayer(listBox); var adorner = new RectangleAdorner(listBox); adornerLayer.Add(adorner); adorner.Start(e.GetPosition(listBox)); _DragStart = e.GetPosition(listBox); foreach (var item in listBox.Items) { var listBoxItem = (ListBoxItem)listBox.ItemContainerGenerator.ContainerFromItem(item); var itemRect = VisualTreeHelper.GetDescendantBounds(listBoxItem); var itemBounds = listBoxItem.TransformToAncestor(listBox).TransformBounds(itemRect); if (itemBounds.Contains(_DragStart.Value)) { listBoxItem.IsSelected = !listBoxItem.IsSelected; } } } private void ListBox_PreviewMouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed && _DragStart != null) { var listBox = (ListBox)sender; var adornerLayer = AdornerLayer.GetAdornerLayer(listBox); var adorner = (RectangleAdorner)adornerLayer.GetAdorners(listBox)[0]; adorner.Update(e.GetPosition(listBox)); } } private void ListBox_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { var listBox = (ListBox)sender; var adornerLayer = AdornerLayer.GetAdornerLayer(listBox); var adorner = (RectangleAdorner)adornerLayer.GetAdorners(listBox)[0]; adornerLayer.Remove(adorner); if (_DragStart != null) { var dragEnd = e.GetPosition(listBox); // 사각형 영역 계산 var rect = new Rect(_DragStart.Value, dragEnd); foreach (var item in listBox.Items) { var listBoxItem = (ListBoxItem)listBox.ItemContainerGenerator.ContainerFromItem(item); var itemRect = VisualTreeHelper.GetDescendantBounds(listBoxItem); var itemBounds = listBoxItem.TransformToAncestor(listBox).TransformBounds(itemRect); // 원래 코드 //if (itemBounds.Contains(rect)) { // listBoxItem.IsSelected = !listBoxItem.IsSelected; //} //else if (rect.IntersectsWith(itemBounds)) { // listBoxItem.IsSelected = true; //} if (rect.IntersectsWith(itemBounds)) { listBoxItem.IsSelected = !listBoxItem.IsSelected; } } } _DragStart = null; } private void Button_Click_EditPosIdx(object sender, RoutedEventArgs e) { var fovInfo = VisionRecipeManager.GetFovInfos().FirstOrDefault(); var cameraDisplay = CameraDisplayManager.GetDisplay(fovInfo, eDisplayType.Machine_B); VisionCommonUI.ChildImageSettingWindow.Instance?.Show(fovInfo, cameraDisplay); } private void Button_Click_SelectAll(object sender, RoutedEventArgs e) { foreach (var item in ListBox.Items) { var listBoxItem = (ListBoxItem)ListBox.ItemContainerGenerator.ContainerFromItem(item); listBoxItem.IsSelected = true; } } private void Button_Click_DeSelectAll(object sender, RoutedEventArgs e) { foreach (var item in ListBox.Items) { var listBoxItem = (ListBoxItem)ListBox.ItemContainerGenerator.ContainerFromItem(item); listBoxItem.IsSelected = false; } } private void Button_Click_Invert(object sender, RoutedEventArgs e) { foreach (var item in ListBox.Items) { var listBoxItem = (ListBoxItem)ListBox.ItemContainerGenerator.ContainerFromItem(item); listBoxItem.IsSelected = !listBoxItem.IsSelected; } } private void Button_Click_Save(object sender, RoutedEventArgs e) { (this.DataContext as WDSelectScoutFieldViewModel).PerformCmdSave(); if (VisionCommonUI.ChildImageSettingWindow.Instance.IsActive) { VisionCommonUI.ChildImageSettingWindow.Instance.Close(); } } } }