using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using XHandler.Class; namespace XHandler.Controls { /// /// WellPlateEx.xaml 的交互逻辑 /// public partial class WellPlateEx : UserControl { #region custom event /// /// 选中列事件,参数为选中的列数 /// public static readonly RoutedEvent SelectedRoutedEvent = EventManager.RegisterRoutedEvent("SelectedEvent", RoutingStrategy.Bubble, typeof(CustomEvent.CustomRoutedEventHandler), typeof(WellPlateEx)); [Description("SelectedEvent")] public event CustomEvent.CustomRoutedEventHandler SelectedEvent { add { this.AddHandler(SelectedRoutedEvent, value); } remove { this.RemoveHandler(SelectedRoutedEvent, value); } } private void RaiseSelectEvent(string str) { CustomRoutedEventArgs arg = new CustomRoutedEventArgs(SelectedRoutedEvent, str); this.RaiseEvent(arg); } #endregion private List groupList = new List(); /// /// 行数 /// public static readonly DependencyProperty RowsProperty = DependencyProperty.Register("Rows", typeof(int), typeof(WellPlateEx), new FrameworkPropertyMetadata((int)8)); public int Rows { get { return (int)GetValue(RowsProperty); } set { SetValue(RowsProperty, value); } } /// /// 列数 /// public static readonly DependencyProperty ColumnsProperty = DependencyProperty.Register("Columns", typeof(int), typeof(WellPlateEx), new FrameworkPropertyMetadata((int)12, OnCountChanged)); public int Columns { get { return (int)GetValue(ColumnsProperty); } set { SetValue(ColumnsProperty, value); } } public static void OnCountChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { WellPlateEx plate = (WellPlateEx)d; Debug.WriteLine("rows=" + plate.Rows.ToString() + ", columns=" + plate.Columns.ToString()); plate.CreateWells(); } public static readonly DependencyProperty SelectionProperty = DependencyProperty.Register("Selection", typeof(string), typeof(WellPlateEx), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnSelectionChanged), null)); /// /// 选择内容 /// public string Selection { get { return (string)GetValue(SelectionProperty); } set { SetValue(SelectionProperty, value); } } private static void OnSelectionChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { WellPlateEx plate = sender as WellPlateEx; string str = (string)e.NewValue; plate.SetSelection(str); } private List list= new List(); private Point startPoint; public WellPlateEx() { InitializeComponent(); } private void idGrid_PreviewMouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { Point curPos = e.GetPosition(idGrid); if ((Math.Abs(curPos.X - startPoint.X) > SystemParameters.MinimumHorizontalDragDistance) || (Math.Abs(curPos.Y - startPoint.Y) > SystemParameters.MinimumVerticalDragDistance)) { Rect rect = GetCorrectRect(startPoint, curPos); List listCol = new List(); foreach (var child in idGrid.Children) { if (child is Border) { Border border = (Border)child; GeneralTransform generalTransform1 = border.TransformToAncestor(idGrid); Point currentPoint = generalTransform1.Transform(new Point(0, 0)); Rect childRect = new Rect(currentPoint.X, currentPoint.Y, border.ActualWidth, border.ActualHeight); if (childRect.IntersectsWith(rect)) { border.Background = FindResource("blueBrush") as SolidColorBrush; if (!list.Contains(border.Name)) list.Add(border.Name); } else { TextBlock tb = border.Child as TextBlock; if (string.IsNullOrEmpty(tb.Text)) { border.Background = Brushes.White; if (list.Contains(border.Name)) list.Remove(border.Name); } } } } } } } private string ChangePosToString(int row, int col) { string ret = ""; char ch = (char)('A' + row); string strRow = ch.ToString(); ret = strRow + (col+1).ToString(); return ret; } private void UserControl_Loaded(object sender, RoutedEventArgs e) { this.MouseLeave += WellPlate_MouseLeave; idGrid.MouseLeave += idGrid_MouseLeave; CreateWells(); if(groupList.Count>0) { foreach(Border bd in idGrid.Children) { TextBlock tb = bd.Child as TextBlock; int i = 1; foreach (string wells in groupList) { string[] ary = wells.Split(','); if(ary.Contains(bd.Name)) { bd.Background = FindResource("blueBrush") as SolidColorBrush; tb.Text = i.ToString(); } i++; } } } } private void WellPlate_MouseLeave(object sender, MouseEventArgs e) { } private void idGrid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { startPoint = e.GetPosition(idGrid); list.Clear(); if (e.Source is Border) { Border element = (Border)e.Source; if (element == null) return; element.Background = FindResource("blueBrush") as SolidColorBrush; list.Add(element.Name); } } private void idGrid_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { string str = ""; foreach(Border rect in idGrid.Children) { if(list.Contains(rect.Name)) { if (string.IsNullOrEmpty(str)) str = rect.Name; else str += "," + rect.Name; } } Selection = str; } private void idGrid_MouseLeave(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { string str = ""; foreach (Border rect in idGrid.Children) { if (list.Contains(rect.Name)) { if (string.IsNullOrEmpty(str)) str = rect.Name; else str += "," + rect.Name; } } Selection = str; } } private void UpdatePlate() { if (idGrid.Children.Count == 0) return; int count = Rows * Columns; for (int i = 0; i < count; i++) { Border border = idGrid.Children[i] as Border; if (list.Contains(border.Name)) border.Background = FindResource("blueBrush") as SolidColorBrush; else { TextBlock tb = border.Child as TextBlock; if(string.IsNullOrEmpty(tb.Text)) border.Background = Brushes.White; } } } public string GetSettingWells() { string ret = ""; if (groupList.Count == 0) return ret; ret = string.Join(",", groupList); return ret; } public void CreateWells() { topGrid.Children.Clear(); topGrid.ColumnDefinitions.Clear(); leftGrid.Children.Clear(); leftGrid.RowDefinitions.Clear(); idGrid.Children.Clear(); idGrid.RowDefinitions.Clear(); idGrid.ColumnDefinitions.Clear(); for (int column = 0; column < Columns; column++) { topGrid.ColumnDefinitions.Add(new ColumnDefinition()); TextBlock tb = new TextBlock() { Text = (column + 1).ToString(), Style = FindResource("smallTextStyle1") as Style, }; topGrid.Children.Add(tb); Grid.SetColumn(tb, column); idGrid.ColumnDefinitions.Add(new ColumnDefinition()); } for (int row = 0; row < Rows; row++) { leftGrid.RowDefinitions.Add(new RowDefinition()); char ch = (char)('A' + row); TextBlock tb = new TextBlock() { Text = ch.ToString(), Style = FindResource("smallTextStyle2") as Style, }; leftGrid.Children.Add(tb); Grid.SetRow(tb, row); idGrid.RowDefinitions.Add(new RowDefinition()); } for (int column = 0; column < Columns; column++) { for (int row = 0; row < Rows; row++) { Border border = new Border(); border.Name = ChangePosToString(row, column); if (Columns > 12) border.Margin = new Thickness(2, 2, 2, 2); else border.Margin = new Thickness(4, 4, 4, 4); border.Background = Brushes.White; border.BorderBrush = Brushes.Gray; border.BorderThickness = new Thickness(1,1,1,1); TextBlock textBlock = new TextBlock(); textBlock.Foreground = Brushes.White; textBlock.HorizontalAlignment = System.Windows.HorizontalAlignment.Center; textBlock.VerticalAlignment = System.Windows.VerticalAlignment.Center; border.Child = textBlock; idGrid.Children.Add(border); Grid.SetRow(border, row); Grid.SetColumn(border, column); } } } public void SetSelection(string selection) { list.Clear(); if (selection == null) return; string[] ary = selection.Split(','); foreach (string s in ary) { if(string.IsNullOrEmpty(s)) break; list.Add(s); } UpdatePlate(); } Rect GetCorrectRect(Point start, Point end) { if (end.X < start.X) { double tmp = start.X; start.X = end.X; end.X = tmp; } if (end.Y < start.Y) { double tmp = start.Y; start.Y = end.Y; end.Y = tmp; } return new Rect(start.X, start.Y, end.X - start.X, end.Y - start.Y); } public void AddGroup(string wells) { if(string.IsNullOrEmpty(wells)) return; string[] ary = wells.Split(','); List wellList = new List(ary); int count = groupList.Count; for(int i=0;i