using DataEntity.Device;
using DataEntity.Share;
using DataRWDAL;
using DataRWDAL.Device;
using HandyControl.Data;
using HxEnum;
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Configuration;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Xml;
using XCommon;
using XCommon.Log;
using XCommon.Tip;
using XCommon.Xml;
using XCore;
using XHandler.Class;
using XHandler.Class.DataEx;
using XHandler.Controls;
using XHandler.View.BacteriaProperty;
using XHandler.View.Dialog;
using XHandler.View.MethodProperty;
using XImagingXhandler.XDAL;
using XHandler.View.Consumables;
using DataEntity;
using MySqlX.XDevAPI.Relational;
using XHandler.View.Liquids;
using XHandler.View.Com;
using DriverLibrary;
using XHandler.View.MethodProperty.ElectroPart;
using System.Reflection;
namespace XHandler.View
{
///
/// TestDesign.xaml 的交互逻辑
///
public partial class TestDesign : UserControl,IConsumableObserver,IElseFromIfObserver
{
private int nTableRows = 4; // 台面行数
private int nTableColumns = 5; // 台面列数
private double zoomVal = 2.5; //真实台面与显示台面的比例
public ObservableCollection methodGroupCollection = new ObservableCollection();
public MethodEx rootMethod = new MethodEx();
private AdornerLayer mAdornerLayer = null;
private bool isDragDrop = false;
private MethodListBll methodListBll = new MethodListBll();
private int nTrashIndex = -1; // 垃圾桶耗材索引
private ObservableCollection labwareCollection;
private LabwareEx copyLabware = null;
private List copyMethod = null;
private MainWindow mainWindow = null;
public static List SelectLabwares = new List();
public bool IsIgnore = false; // 忽略拖动
public TestDesign()
{
InitializeComponent();
nTableRows = Shared.SoftwareInformation.rows;
nTableColumns = Shared.SoftwareInformation.columns;
mainWindow = (MainWindow)Application.Current.MainWindow;
// 获取命令集
ObservableCollection methods = MethodDB.GetMethodFromdb(Shared.SoftwareInformation.software_device_number);
// 获取命令分组
ObservableCollection group = MethodGroupDB.GetMethodGroupFromdb();
foreach (MethodGroup mg in group)
{
CMethodGroup cmg = new CMethodGroup();
cmg.GroupName = mg.method_group_name;
var list = methods.Where(s => s.method_group_id == mg.method_group_id).ToList();
foreach (var item in list)
{
MethodEx mEx = new MethodEx(item);
if (mEx.method_group_id == EnumManagement.GetEnumValue(MethodGroupEnum.ThirdPart))
{
mEx.device = DeviceConfigDB.GetInfodById(mEx.method_id.ToString());
}
cmg.Children.Add(mEx);
}
if (cmg.Children.Count > 0)
{
methodGroupCollection.Add(cmg);
}
}
listboxCmd.ItemsSource = methodGroupCollection;
// 获取耗材类型
ObservableCollection labwareTypeCollection = DataModule.getInstance().GetLabwareTypes();
if (labwareTypeCollection.FirstOrDefault(x => x.labwaretype_name.Equals("请选择")) == null)
{
labwareTypeCollection.Insert(0, new LabwareType { labwaretype_id = "-1", labwaretype_name = "请选择" });
}
cbLabwareType.ItemsSource = labwareTypeCollection;
// 获取耗材
labwareCollection = DataModule.getInstance().GetLabwares();
listviewConsumable.ItemsSource = labwareCollection;
//判断当前系统使用的是什么台面模板
int latticeNum = 1; // PN
TabletopTemplate tabletopTemplate= TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb();
if (tabletopTemplate == null)
{
// 获取当前台面板位信息数据
List latticeList = DataModule.getInstance().GetLattices();
if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceLiteChoice) ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200))
{
// 第6列是垃圾桶
nTableColumns++;
}
#region 台面布局 X行*Y列
for (int i = 0; i < nTableRows; i++)
{
gridTable.RowDefinitions.Add(new RowDefinition());
}
for (int j = 0; j < nTableColumns; j++)
{
gridTable.ColumnDefinitions.Add(new ColumnDefinition());
}
#endregion
// 挑菌的板位号:P25/P16
string choiceLatticeId = ConfigurationManager.AppSettings["choiceLatticeId"].ToString();
for (int iColumnIndex = 0; iColumnIndex < nTableColumns; iColumnIndex++)
{
for (int iRowIndex = 0; iRowIndex < nTableRows; iRowIndex++)
{
// 板位索引
int latticeIndex = iColumnIndex * nTableRows + iRowIndex;
if (latticeIndex + 1 > latticeList.Count)
{
break;
}
// 微牧:P16与P17合并单元格,不添加P14控件
if ((Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceLiteChoice) ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200)) &&
latticeNum == mainWindow.ChoiceLatticeId + 1)
{
latticeNum++;
continue;
}
// 是否是垃圾桶
bool isTrash = latticeList[latticeIndex].is_trash == 1;
if (isTrash)
nTrashIndex = latticeNum;
// 添加台面布置格子
Canvas canvas = AddTableItems(iRowIndex, iColumnIndex, latticeNum, isTrash);
latticeNum++;
int ncol = nTableColumns - iColumnIndex - 1;
int zindex = ncol * nTableRows + iRowIndex;
Panel.SetZIndex(canvas, zindex);
if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceLiteChoice) ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200))
{
if (latticeIndex == mainWindow.ChoiceLatticeId - 1) // P16、P17
{
Labware lbe = LabwareDB.GetLabware(ConfigurationManager.AppSettings["choicelabwareId"].ToString());
ControlLabware control = new ControlLabware();
if (lbe.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.CircularDish).ToString()) // 圆形皿
{
control.LabwareWidth = canvas.ActualWidth;
control.LabwareHeight = canvas.ActualHeight;
control.LeftSideColor = ComUtility.RGBToColor(lbe.labware_color_lside);
control.FrontColor = ComUtility.RGBToColor(lbe.labware_color_front);
control.TopColor = ComUtility.RGBToColor(lbe.labware_color_top);
control.BorderColor = ComUtility.RGBToColor(lbe.labware_color_line);
control.Rows = (int)lbe.number_row;
control.Columns = (int)lbe.number_column;
control.WellColor = Colors.White;
control.IsFill = true;
control.Label = canvas.Name;
control.LabwareType = Convert.ToInt16(lbe.labware_type_id);
control.ValidWells = "";
control.Width = canvas.ActualWidth;
control.Height = canvas.ActualHeight + 4;
}
Canvas.SetLeft(control, 0);
Canvas.SetBottom(control, 0);
LabwareEx lb = new LabwareEx(lbe);
lb.row = Grid.GetRow(canvas);
lb.col = Grid.GetColumn(canvas);
lb.position = canvas.Name;
lb.validWells = control.ValidWells;
canvas.DataContext = lb;
canvas.Children.Add(control);
control.SetValidWells(control.ValidWells);
}
}
}
}
//borderTable.SizeChanged += BorderTable_SizeChanged;
gridTable.SizeChanged += GridTable_SizeChanged;
}
else //使用加载当前使用的模板
{
SetTabletopGraduated();
//加载台面板位
//加载该台面模板
ObservableCollection latticesList = TabletopTemplateDB.GetLatticesByTabletopTemplateId(tabletopTemplate.tabletopid);
int iLatticeCount = latticesList.Count+1;
foreach (Lattice lattice in latticesList)
{
// 是否是垃圾桶
bool isTrash = (lattice.is_trash == 1) ? true:false;
if (isTrash)
nTrashIndex = Convert.ToInt32(lattice.lattice_num.Substring(1, lattice.lattice_num.Length - 1));
// 添加台面布置格子
Canvas canvas = AddLatticeIntoTabletop(lattice, tabletopTemplate.tabletopid);
//latticeNum++;
//int ncol = nTableColumns - iColumnIndex - 1;
int zindex = iLatticeCount--;
Panel.SetZIndex(canvas, zindex);
if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceLiteChoice) ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200))
{
if (Convert.ToInt32(lattice.lattice_num.Substring(1, lattice.lattice_num.Length - 1)) == mainWindow.ChoiceLatticeId - 1) // P16、P17
{
Labware lbe = LabwareDB.GetLabware(ConfigurationManager.AppSettings["choicelabwareId"].ToString());
ControlLabware control = new ControlLabware();
if (lbe.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.CircularDish).ToString()) // 圆形皿
{
control.LabwareWidth = canvas.ActualWidth;
control.LabwareHeight = canvas.ActualHeight;
control.LeftSideColor = ComUtility.RGBToColor(lbe.labware_color_lside);
control.FrontColor = ComUtility.RGBToColor(lbe.labware_color_front);
control.TopColor = ComUtility.RGBToColor(lbe.labware_color_top);
control.BorderColor = ComUtility.RGBToColor(lbe.labware_color_line);
control.Rows = (int)lbe.number_row;
control.Columns = (int)lbe.number_column;
control.WellColor = Colors.White;
control.IsFill = true;
control.Label = canvas.Name;
control.LabwareType = Convert.ToInt16(lbe.labware_type_id);
control.ValidWells = "";
control.Width = canvas.ActualWidth;
control.Height = canvas.ActualHeight + 4;
}
Canvas.SetLeft(control, 0);
Canvas.SetBottom(control, 0);
LabwareEx lb = new LabwareEx(lbe);
lb.row = Grid.GetRow(canvas);
lb.col = Grid.GetColumn(canvas);
lb.position = canvas.Name;
lb.validWells = control.ValidWells;
canvas.DataContext = lb;
canvas.Children.Add(control);
control.SetValidWells(control.ValidWells);
}
}
else if (Shared.SoftwareInformation.software_device_number == DeviceCategory.DeviceHXELEC)//电泳切胶槽位置
{
if (Convert.ToInt32(lattice.lattice_num.Substring(1, lattice.lattice_num.Length - 1)) == 1) // P1
{
Labware lbe = LabwareDB.GetLabware(ConfigurationManager.AppSettings["choicelabwareId"].ToString());
ControlLabware control = new ControlLabware();
if (lbe.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.Electrophoto).ToString()) //电泳槽
{
control.LabwareWidth = canvas.ActualWidth;
control.LabwareHeight = canvas.ActualHeight;
control.LabwareRealLength = lbe.labware_length;
control.LabwareRealWidth = lbe.labware_width;
control.Rows = (int)lbe.number_row;
control.Columns = (int)lbe.number_column;
control.WellColor = Colors.White;
control.IsFill = true;
control.Label = canvas.Name;
control.LabwareName = lbe.labware_name;
control.LabwareType = Convert.ToInt16(lbe.labware_type_id);
control.ValidWells = "";
control.labwareWellInfoList = lbe.labwareWellInfoList;
control.Loaded += ControlLabware_Loaded;
control.Width = canvas.Width;
control.Height = canvas.Height;
}
Canvas.SetLeft(control, 0);
Canvas.SetTop(control, 0);
LabwareEx lb = new LabwareEx(lbe);
lb.row = Grid.GetRow(canvas);
lb.col = Grid.GetColumn(canvas);
lb.position = canvas.Name;
lb.validWells = control.ValidWells;
control.Height = canvas.Height;
canvas.DataContext = lb;
canvas.Children.Add(control);
control.SetValidWells(control.ValidWells);
labwareExes = new Stack();
labwareExes.Push(lb);
canvas.Tag = labwareExes;
}
}
}
}
#region 初始化工作流
latticeNum = 0;
var mList = methods.Where(s => s.method_group_id == EnumManagement.GetEnumValue(MethodGroupEnum.None)).OrderBy(s => s.method_id);
rootMethod.method_name = "root";
rootMethod.isEnabled = true;
rootMethod.Level = -1;
foreach (Method m in mList)
{
MethodEx mi = new MethodEx(m, rootMethod);
mi.Index = rootMethod.Children.Count + 1;
mi.strIndex = mi.Index.ToString();
mi.Moveable = false;
if (latticeNum == 0)
{
mi.canDrop = false;
}
else if ((latticeNum + 1) == mList.Count())
{
mi.canDrop = false;
}
rootMethod.Children.Add(mi);
if (mi.method_id == "0") // 开始
{
StartProperty property = new StartProperty(mi);
mi.control = property;
mi.method_isrun = "运行起点";
}
else if (mi.method_id == "2") // 结束
{
EndProperty property = new EndProperty(mi);
mi.control = property;
}
latticeNum++;
}
treeviewWorkflow.ItemsSource = rootMethod.Children;
TreeViewExtensions.testDesign = this;
#endregion
if (Shared.SoftwareInformation.software_device_number == DeviceCategory.DeviceHXELEC)//电泳切胶槽位置
{
//imgdish.Visibility = Visibility.Visible;
//imgdish1.Visibility = Visibility.Collapsed;
}
if (Shared.SoftwareInformation.software_device_number == DeviceCategory.DeviceChoice)
{
imgdish.Visibility = Visibility.Visible;
//imgdish1.Visibility = Visibility.Collapsed;
}
else if (Shared.SoftwareInformation.software_device_number == DeviceCategory.DeviceLiteChoice ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200))
{
//imgdish1.Visibility = Visibility.Visible;
imgdish.Visibility = Visibility.Collapsed;
}
else
{
imgdish.Visibility = Visibility.Collapsed;
//imgdish1.Visibility = Visibility.Collapsed;
}
}
#region 耗材加载后,重新设置高度
private void ControlLabware_Loaded(object sender, RoutedEventArgs e)
{
var controlLabware= sender as ControlLabware;
if(controlLabware!=null)
{
controlLabware.Height = ((Canvas)(controlLabware.Parent)).Height;
controlLabware.Width= ((Canvas)(controlLabware.Parent)).Width;
}
}
#endregion
#region 初始化新建流程
public void InitializeWorkFlow(ObservableCollection methods)
{
int latticeNum = 0;
rootMethod.Children.Clear();
var mList = methods.Where(s => s.method_group_id == EnumManagement.GetEnumValue(MethodGroupEnum.None)).OrderBy(s => s.method_id);
rootMethod.method_name = "root";
rootMethod.Level = -1;
foreach (Method m in mList)
{
MethodEx mi = new MethodEx(m, rootMethod);
mi.Index = rootMethod.Children.Count + 1;
mi.strIndex = mi.Index.ToString();
mi.Moveable = false;
if (latticeNum == 0)
{
mi.canDrop = false;
}
else if ((latticeNum + 1) == mList.Count())
{
mi.canDrop = false;
}
rootMethod.Children.Add(mi);
if (mi.method_id == "0") // 开始
{
StartProperty property = new StartProperty(mi);
mi.control = property;
mi.method_isrun = "运行起点";
}
else if (mi.method_id == "2") // 结束
{
EndProperty property = new EndProperty(mi);
mi.control = property;
}
latticeNum++;
}
treeviewWorkflow.ItemsSource = rootMethod.Children;
TreeViewExtensions.testDesign = this;
}
#endregion
#region 布局当前台面的大小
///
/// 布局当前台面的大小
///
public void SetTabletopGraduated()
{
double length = Shared.SoftwareInformation.realtabletoplength;//mm
double width = Shared.SoftwareInformation.realtabletopwidth;//mm
if(Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceHXELEC))
{
zoomVal = 1.5;
}
gridTable.Width = length / zoomVal;//统一缩小,即1个像素代表2.5mm
gridTable.Height = width / zoomVal;
}
#endregion
#region 向新布局的台面中添加板位--板位用canvas
public Canvas AddLatticeIntoTabletop(Lattice lattice,string tabletopid)
{
int latticeId = Convert.ToInt32(lattice.lattice_num.Substring(1, lattice.lattice_num.Length - 1));
bool bAllowDrop = true;
if (latticeId == mainWindow.ChoiceLatticeId)
{
bAllowDrop = false;
}
else if ((Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceLiteChoice) ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200)) &&
latticeId == 19)
{
latticeId = 0;
}
TabletopRelLattice tabletopRelLattice = TabletopRelLatticeDB.GetTabletopRelLatticeByTabletopIdAndLatticeId(tabletopid, Convert.ToInt32(lattice.lattice_id));
Canvas canvas = new Canvas()
{
Margin = new Thickness(6, 6, 6, 6),
AllowDrop = bAllowDrop,
Name = "P" + latticeId.ToString(),
Width=LabwareDB.GetLabware(tabletopRelLattice.labware_id).labware_length/zoomVal,
Height= LabwareDB.GetLabware(tabletopRelLattice.labware_id).labware_width/zoomVal
};
TextBlock tb = new TextBlock();
tb.Text = "P" + latticeId.ToString();
tb.FontSize = 18;
tb.Foreground = Brushes.Black;
tb.VerticalAlignment = VerticalAlignment.Center;
tb.HorizontalAlignment = HorizontalAlignment.Center;
Border border = new Border()
{
Background = Brushes.DarkGray,
CornerRadius = new CornerRadius(5),
Child = tb,
};
canvas.Children.Add(border);
canvas.Drop += Canvas_Drop;
canvas.PreviewMouseDown += Canvas_PreviewMouseDown;
canvas.PreviewMouseMove += Canvas_PreviewMouseMove;
canvas.QueryContinueDrag += DoQueryContinueDrag;
canvas.PreviewDragOver += Canvas_PreviewDragOver;
canvas.SizeChanged += Canvas_SizeChanged;
canvas.ContextMenu = FindResource("tableMenu") as ContextMenu;
canvas.Loaded += Canvas_Loaded;
canvas.Tag = tabletopRelLattice;
if (lattice.is_trash==1)
{
ControlLabware cl = new ControlLabware()
{
IsTrash = true,
LabwareName = Properties.Resources.strTrash.ToString()
};
LabwareEx lb = new LabwareEx();
lb.labware_name = Properties.Resources.strTrash;
lb.row = 0;
lb.col = 0;
canvas.DataContext = lb;
canvas.Children.Add(cl);
}
gridTable.Children.Add(canvas);
//Grid.SetColumn(canvas, column);
//Grid.SetRow(canvas, row);
if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceLiteChoice) ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200))
{
#region 挑菌台面暂时屏蔽
/*if (lattice.is_trash == 1)
{
Grid.SetColumnSpan(canvas, 1);
Grid.SetRowSpan(canvas, 3);
}
else if (latticeId == mainWindow.ChoiceLatticeId)
{
Grid.SetColumnSpan(canvas, 1);
Grid.SetRowSpan(canvas, 2);
// 将Image控件添加到Canvas上
Image image = new Image();
image.Source = (ImageSource)(new ImageSourceConverter()).ConvertFrom(new Uri(@"pack://application:,,,/XHandler;component/Assets/dish_LiteChoice.png"));
image.Stretch = Stretch.Fill;
image.Width = canvas.Width - 4;
image.Height = canvas.Height - 23;
Canvas.SetLeft(image, 2);
Canvas.SetTop(image, 2);
canvas.Children.Add(image);
Panel.SetZIndex(image, 99);
}*/
#endregion
}
return canvas;
}
#endregion
#region 板位加载显示完成后,处理布局
private void Canvas_Loaded(object sender, RoutedEventArgs e)
{
Canvas canvasOfLattice = sender as Canvas;
canvasOfLattice.HorizontalAlignment = HorizontalAlignment.Left;
canvasOfLattice.VerticalAlignment = VerticalAlignment.Top;
canvasOfLattice.Loaded -= Canvas_Loaded;
//换算在新的平面坐标中,板位的位置
if (canvasOfLattice.Tag == null)
{
return;
}
if (canvasOfLattice.Tag.GetType().Name == "TabletopRelLattice")
{
if (((TabletopRelLattice)canvasOfLattice.Tag) == null)
{
return;
}
}
else
{
return;
}
TabletopRelLattice tabletopRelLattice= (TabletopRelLattice)canvasOfLattice.Tag;
double xPixelVal = tabletopRelLattice.lattice_pixel_x / (zoomVal / (double)2);
double yPixelVal = tabletopRelLattice.lattice_pixel_y / (zoomVal / (double)2);
canvasOfLattice.Margin = new Thickness(xPixelVal, yPixelVal, 0, 0);
canvasOfLattice.Tag = null;
}
#endregion
#region 观察者模式更新所有应用台面的板位
// 保存观察者耗材列表
public List observers = new List();
public void AddObserver(ILatticeObserver ob)
{
observers.Add(ob);
}
public void RemoveObserver(ILatticeObserver ob)
{
observers.Remove(ob);
}
public void Update()
{
// 遍历订阅者列表进行通知
foreach (ILatticeObserver ob in observers)
{
if (ob != null)
{
ob.ReceiveAndUpdate(this);
}
}
}
#endregion
#region 观察者模式更新所有应用的等待参数
// 保存观察者等待参数列表
public List observerTimers = new List();
public void AddObserver(ITimerObserver ob)
{
observerTimers.Add(ob);
}
public void RemoveObserver(ITimerObserver ob)
{
observerTimers.Remove(ob);
}
public void UpdateWaitFor(MethodEx mEx)
{
//获取指定节点前的timer集合
List methodExesForTimerList = FindNodesFilterTimer(mEx.strIndex);
List methodDuringTimerList = new List();
if (methodExesForTimerList != null)
{
foreach (MethodEx x in methodExesForTimerList)
{
DropdownName dropdownName = new DropdownName();
dropdownName.dropdown_id = x.strIndex;
dropdownName.dropdown_name = (x.control!=null?(x.control as TimerProperty).methodTimer.name:x.method_name);
methodDuringTimerList.Add(dropdownName);
}
}
// 遍历订阅者列表进行通知
foreach (ITimerObserver ob in observerTimers)
{
if (ob != null)
{
if (((WaitforProperty)ob).method.strIndex == mEx.strIndex)
{
ob.ReceiveAndUpdate(methodDuringTimerList);
break;
}
}
}
}
#endregion
public void ReceiveAndUpdate(ConsumableManagement consumableManagement)
{
//// 获取耗材类型
//ObservableCollection labwareTypeCollection = DataModule.getInstance().GetLabwareTypes();
//if (labwareTypeCollection.FirstOrDefault(x => x.labwaretype_name.Equals("请选择")) == null)
//{
// labwareTypeCollection.Insert(0, new LabwareType { labwaretype_id = "-1", labwaretype_name = "请选择" });
//}
//cbLabwareType.ItemsSource = labwareTypeCollection;
//// 获取耗材
//labwareCollection = DataModule.getInstance().GetLabwares();
//listviewConsumable.ItemsSource = labwareCollection;
//更新前先生成现有台面的xml节点对象;
//清除所有耗材对象;
//恢复保存的xml节点对象到台面
XmlHelper xmlHelper = new XmlHelper();
xmlHelper.xmlDoc = GenerateLaunchXmlDocument();
btnResetTable_Click(null, null);
mainWindow.BindSetLatticesDataOnUI(xmlHelper.xmlDoc);
}
#region 在给定的树节点中加入或者移除else节点
public void ReceiveAndUpdate(MethodEx methodEx,bool containElse)
{
try
{
if(methodEx!=null)
{
if(containElse)
{
//在给定的节点同级别层次加入else节点
}
else
{
//删除仅跟随在给定节点之后的else节点
}
}
}
catch(Exception ex)
{
}
}
#endregion
///
/// 添加第三方设备命令
///
///
private void AddThirdPartChildren(CMethodGroup cmg)
{
// 根据项目ID,获取设备列表
var lstDevice = DeviceConfigDB.GetDeviceConfigListByProjectId(Shared.SoftwareInformation.software_information_id);
foreach (var deviceItem in lstDevice)
{
Method m = new Method();
m.method_id = deviceItem.Id==null? "0" : deviceItem.Id;
m.method_name = deviceItem.Name;
m.method_status = EnumManagement.GetEnumValue(MethodStatusEnum.Valid); // 有效
m.method_content = deviceItem.Name;
m.method_Tipcontent = string.Empty;
m.method_ico = deviceItem.EquipmentImg; // 设备图片
m.method_group_id = EnumManagement.GetEnumValue(MethodGroupEnum.ThirdPart); // 第三方设备
m.method_support = EnumManagement.GetEnumValue(MethodSupportEnum.Support); // 支持
m.method_type = EnumManagement.GetEnumValue(MethodTypeEnum.SingleStep); // 单指令
MethodEx mEx = new MethodEx(m);
mEx.device = deviceItem;
cmg.Children.Add(mEx);
}
}
private void BorderTable_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (borderTable.ActualWidth <= 0)
return;
borderTable.Height = borderTable.ActualWidth * 9 / 16;
}
private void GridTable_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (gridTable.ActualWidth <= 0)
return;
//gridTable.Height = gridTable.ActualWidth * 9 / 15; wdy
double w = gridTable.ActualWidth / nTableColumns;
double h = gridTable.ActualHeight / nTableRows;
imgdish.Width = w * 2 - 5;
imgdish.Height = h * 2 - 5;
//imgdish1.Width = w - 5;
//imgdish1.Height = h * 2 - 5;
}
///
/// 添加台面布置格子
///
///
///
///
///
///
private Canvas AddTableItems(int row, int column, int latticeNum, bool isTrash)
{
bool bAllowDrop = true;
if (latticeNum == mainWindow.ChoiceLatticeId)
{
bAllowDrop = false;
}
else if ((Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceLiteChoice) ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200)) &&
latticeNum == 19)
{
latticeNum = 0;
}
Canvas canvas = new Canvas()
{
Margin = new Thickness(6, 6, 6, 6),
AllowDrop = bAllowDrop,
Name = "P" + latticeNum.ToString(),
};
TextBlock tb = new TextBlock();
tb.Text = "P" + latticeNum.ToString();
tb.FontSize = 18;
tb.Foreground = Brushes.Black;
tb.VerticalAlignment = VerticalAlignment.Center;
tb.HorizontalAlignment = HorizontalAlignment.Center;
Border border = new Border()
{
Background = Brushes.DarkGray,
CornerRadius = new CornerRadius(5),
Child = tb,
};
canvas.Children.Add(border);
canvas.Drop += Canvas_Drop;
canvas.PreviewMouseDown += Canvas_PreviewMouseDown;
canvas.PreviewMouseMove += Canvas_PreviewMouseMove;
canvas.QueryContinueDrag += DoQueryContinueDrag;
canvas.PreviewDragOver += Canvas_PreviewDragOver;
canvas.SizeChanged += Canvas_SizeChanged;
canvas.ContextMenu = FindResource("tableMenu") as ContextMenu;
if (isTrash)
{
ControlLabware cl = new ControlLabware()
{
IsTrash = true,
LabwareName = Properties.Resources.strTrash.ToString()
//LabwareName = string.Format("垃{0}圾{0}桶", Environment.NewLine)
};
LabwareEx lb = new LabwareEx();
lb.labware_name = Properties.Resources.strTrash;
//lb.labware_name = string.Format("垃{0}圾{0}桶", Environment.NewLine);
lb.row = row;
lb.col = column;
canvas.DataContext = lb;
canvas.Children.Add(cl);
}
gridTable.Children.Add(canvas);
Grid.SetColumn(canvas, column);
Grid.SetRow(canvas, row);
if (Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceLiteChoice) ||
Shared.SoftwareInformation.software_device_number.Equals(DeviceCategory.DeviceT200))
{
if (isTrash)
{
Grid.SetColumnSpan(canvas, 1);
Grid.SetRowSpan(canvas, 3);
}
else if (latticeNum == mainWindow.ChoiceLatticeId)
{
Grid.SetColumnSpan(canvas, 1);
Grid.SetRowSpan(canvas, 2);
// 将Image控件添加到Canvas上
Image image = new Image();
image.Source = (ImageSource)(new ImageSourceConverter()).ConvertFrom(new Uri(@"pack://application:,,,/XHandler;component/Assets/dish_LiteChoice.png"));
image.Stretch = Stretch.Fill;
image.Width = canvas.Width - 4;
image.Height = canvas.Height - 23;
Canvas.SetLeft(image, 2);
Canvas.SetTop(image, 2);
canvas.Children.Add(image);
Panel.SetZIndex(image, 99);
}
}
return canvas;
}
#region 初始化
///
/// 初始化
///
///
///
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
cbLabwareType.SelectedIndex = 0;
UpdateLabwareExData();
var scrollViewer = GetScrollViewer(treeviewWorkflow);
if (scrollViewer != null)
{
scrollViewer.CanContentScroll = false;
}
}
private void UpdateLabwareExData()
{
foreach (var item in gridTable.Children)
{
Canvas canvas = item as Canvas;
if (canvas.DataContext != null)
{
LabwareEx l = canvas.DataContext as LabwareEx;
if (!string.IsNullOrEmpty(l.labware_id))
{
Labware labware = labwareCollection.Where(s => s.labware_id == l.labware_id).FirstOrDefault();
if (labware != null)
{
l.Update(labware);
}
else
{
//已拖出此耗材后删除该耗材导致的null
PlsSetProperty plsSetProperty = new PlsSetProperty($"引用的耗材:{l.labware_name},加载失败,此耗材将自动从台面删除", false);
plsSetProperty.closeEvent += PlsSetProperty_closeEvent;
System.Windows.Window wnd = Application.Current.MainWindow;
Grid parent = Utilities.FindVisualChild(wnd);
parent.Children.Add(plsSetProperty);
ControlLabware labwareError = Utilities.FindVisualChild(canvas);
if (labwareError == null || labwareError.IsTrash)
return;
if (labwareError != null)
{
canvas.Children.Remove(labwareError);
canvas.DataContext = null;
}
}
}
}
}
}
#endregion
#region 台面布置
#region 台面布置单元格中 松开拖拽
//一个存放Canvas的DataContext的集合对象
Stack labwareExes= new Stack();
public Canvas srcCanvas = null;//台面布局拖动更改后,更新关联的已有设计命令用
public Canvas targetCanvas = null;//台面布局拖动更改后,更新关联的已有设计命令用
private void Canvas_Drop(object sender, DragEventArgs e)
{
Canvas canvas = sender as Canvas;
targetCanvas = canvas;
// 挑菌位不可拖动
if (canvas.Name.Equals(ConfigurationManager.AppSettings["choiceLatticeId"].ToString()))
{
e.Handled = true;
//LoggerHelper.DebugLog(string.Format("===================== Canvas_Drop, Handled = true, sender Canvas.Name = {0}=====================", canvas.Name));
return;
}
if (e.Effects == DragDropEffects.Move)
{
Canvas source = e.Data.GetData("Canvas") as Canvas;
if (source.Name.Equals(ConfigurationManager.AppSettings["choiceLatticeId"].ToString()))
{
e.Handled = true;
//LoggerHelper.DebugLog(string.Format("===================== Canvas_Drop, Handled = true, source Canvas.Name = {0}=====================", canvas.Name));
return;
}
ControlLabware clabware = (ControlLabware)Utilities.FindLastVisualChild(source);
if (clabware != null)
{
labwareExes = (Stack)source.Tag;
LabwareEx labwareExPop = new LabwareEx(); ;
if (labwareExes.Count > 0)
{
labwareExes.Pop();
}
source.Children.Remove(clabware);
if (source.Children.Count > 1)
{
//source.DataContext = null;
source.DataContext = labwareExes.Peek();
source.Tag = labwareExes;
}
else
{
source.DataContext = null;
}
}
}
LabwareEx lb = e.Data.GetData("LabwareEx") as LabwareEx;
if (e.Effects == DragDropEffects.Copy ||
e.Effects == DragDropEffects.Move)
{
lb.label = canvas.Name;
}
ControlLabware control = new ControlLabware();
control.LeftSideColor = ComUtility.RGBToColor(lb.labware_color_lside);
control.FrontColor = ComUtility.RGBToColor(lb.labware_color_front);
control.TopColor = ComUtility.RGBToColor(lb.labware_color_top);
control.BorderColor = ComUtility.RGBToColor(lb.labware_color_line);
control.AllowDrop = true;
//control.Drop += ControlLabware_Drop;
if (lb.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.CircularDish).ToString()) // 圆形皿
{
control.LabwareWidth = canvas.ActualWidth;
control.LabwareHeight = canvas.ActualHeight;// canvas.ActualWidth*50/90;
control.Rows = (int)lb.number_row;
control.Columns = (int)lb.number_column;
control.WellColor = Colors.White;
control.IsFill = true;
control.Label = lb.label;
control.LabwareName = lb.labware_name;
control.LabwareType = Convert.ToInt16(lb.labware_type_id);
control.ValidWells = lb.validWells;
control.Width = canvas.ActualWidth;
control.Height = canvas.ActualHeight + 4;
}
else if (lb.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.TipsBox).ToString()) // 吸头盒
{
control.LabwareWidth = canvas.ActualWidth;
control.LabwareHeight = canvas.ActualHeight;
control.Rows = (int)lb.number_row;
control.Columns = (int)lb.number_column;
control.WellColor = Colors.White;
control.IsFill = true;
control.Label = lb.label;
control.LabwareName = lb.labware_name;
control.LabwareType = Convert.ToInt16(lb.labware_type_id);
}
else if (lb.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.Tube).ToString()) // 管架
{
control.LabwareWidth = canvas.ActualWidth;
control.LabwareHeight = canvas.ActualHeight;
control.LabwareRealLength = lb.labware_length;
control.LabwareRealWidth = lb.labware_width;
control.Rows = (int)lb.number_row;
control.Columns = (int)lb.number_column;
control.WellColor = Colors.White;
control.IsFill = true;
control.Label = lb.label;
control.LabwareName = lb.labware_name;
control.LabwareType = Convert.ToInt16(lb.labware_type_id);
control.ValidWells = lb.validWells;
control.labwareWellInfoList = lb.labwareWellInfoList;
}
else if (lb.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.Electrophoto).ToString()) // 电泳槽
{
control.LabwareWidth = canvas.ActualWidth;
control.LabwareHeight = canvas.ActualHeight;
control.LabwareRealLength = lb.labware_length;
control.LabwareRealWidth = lb.labware_width;
control.Rows = (int)lb.number_row;
control.Columns = (int)lb.number_column;
control.WellColor = Colors.White;
control.IsFill = true;
control.Label = lb.label;
control.LabwareName = lb.labware_name;
control.LabwareType = Convert.ToInt16(lb.labware_type_id);
control.ValidWells = lb.validWells;
control.labwareWellInfoList = lb.labwareWellInfoList;
}
else
{
control.LabwareWidth = canvas.ActualWidth;
control.LabwareHeight = canvas.ActualHeight;
control.Rows = (int)lb.number_row;
control.Columns = (int)lb.number_column;
control.WellColor = Colors.White;
control.IsFill = true;
control.Label = lb.label;
control.LabwareName = lb.labware_name;
control.LabwareType = Convert.ToInt16(lb.labware_type_id);
control.ValidWells = lb.validWells;
}
if (lb.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.TipsBox).ToString() ||
lb.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.Plate).ToString()) // 吸头盒、孔板
{
// 设置有效孔位
string validWells = ComUtility.GetValidWells((int)lb.number_row, (int)lb.number_column);
lb.validWells = control.ValidWells = validWells;
}
else
{
control.LabwareWidth = canvas.ActualWidth;
control.LabwareHeight = canvas.ActualHeight;
control.Rows = (int)lb.number_row;
control.Columns = (int)lb.number_column;
control.WellColor = Colors.White;
control.IsFill = true;
control.Label = lb.label;
control.LabwareName = lb.labware_name;
control.LabwareType = Convert.ToInt16(lb.labware_type_id);
control.ValidWells = lb.validWells;
}
control.DataContext = (Labware)lb;
Canvas.SetLeft(control, 0);
Canvas.SetBottom(control, 0);
lb.row = Grid.GetRow(canvas);
lb.col = Grid.GetColumn(canvas);
lb.position = canvas.Name;
canvas.DataContext = lb;
labwareExes = (Stack)canvas.Tag;
if (labwareExes != null)
{
}
else
{
labwareExes = new Stack();
}
labwareExes.Push(lb);
canvas.Tag = labwareExes;
if (lb.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.Tips).ToString()) // 吸头
{
return;
}
//根据重叠的层级,设置margin,用的是下层的耗材数据计算
double leftMargin = 0;//离左侧距离
double bottomMargin = 0;//离底部距离
for (int i=0;i< canvas.Children.Count;i++)
{
ControlLabware a = canvas.Children[i] as ControlLabware;
if(a!=null)
{
leftMargin += a.LabwareDeep;
bottomMargin += a.LabwareDeep;
}
}
control.Margin = new Thickness(leftMargin , 0, 0, bottomMargin);
canvas.Children.Add(control);
SelectLabwares.Add(control);
Border labelText = Utilities.FindVisualChild(canvas);
if (labelText != null)
{
labelText.Width = canvas.ActualWidth;
}
//如果是第二及其以上耗材,要隐藏标签
if (labwareExes.Count > 1)
{
control.Label = "";
}
else
{
}
SetLabwareSelection(control);
SetTableName(canvas.Name, lb);
//引用
mainWindow.SetObserverNode(rootMethod);
Update();
srcCanvas = null;
targetCanvas = null;
}
//private void ControlLabware_Drop(object sender, DragEventArgs e)
//{
// ControlLabware targetControlLabware = (ControlLabware)sender;
// //判断耗材的物理高度,在某些项目中深孔板、试剂槽、圆形皿、枪头盒、管架、枪头不允许叠放;
// if (e.Effects == DragDropEffects.Move)
// {
// ControlLabware source = e.Data.GetData("ControlLabware") as ControlLabware;
// }
//}
#endregion
#region 台面布置单元格中 鼠标点击
private void Canvas_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left)
{
Canvas grid = sender as Canvas;
// 挑菌位不可拖动
if (grid.Name.Equals(ConfigurationManager.AppSettings["choiceLatticeId"].ToString()))
{
e.Handled = true;
//LoggerHelper.DebugLog(string.Format("===================== Canvas_PreviewMouseDown, Handled = true, Canvas.Name = {0}=====================", grid.Name));
return;
}
_lastMouseDown = e.GetPosition(grid);
int row = Grid.GetRow(grid);
int col = Grid.GetColumn(grid);
int index = row * nTableColumns + col + 1;
ControlLabware control = (ControlLabware)Utilities.FindLastVisualChild(grid);
if (control == null)
{
SetTableName(grid.Name, null);
}
else
{
SetLabwareSelection(control);
labwareExes = (Stack)grid.Tag;
if (labwareExes!=null&&labwareExes.Count > 0)
{
SetTableName(grid.Name, labwareExes.Peek() as Labware);
}
else
{
SetTableName(grid.Name, grid.DataContext as Labware);
}
}
srcCanvas = grid;
//LoggerHelper.DebugLog(string.Format("===================== Canvas_PreviewMouseDown Canvas.Name = {0}=====================", grid.Name));
}
}
#endregion
#region 台面布置单元格中 鼠标移动
private void Canvas_PreviewMouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Canvas grid = sender as Canvas;
// 挑菌位不可拖动
if (grid.Name.Equals(ConfigurationManager.AppSettings["choiceLatticeId"].ToString()))
{
e.Handled = true;
//LoggerHelper.DebugLog(string.Format("===================== Canvas_PreviewMouseMove, Handled = true, Canvas.Name = {0}=====================", grid.Name));
return;
}
Point currentPosition = e.GetPosition(grid);
if ((Math.Abs(currentPosition.X - _lastMouseDown.X) > SystemParameters.MinimumHorizontalDragDistance)
|| (Math.Abs(currentPosition.Y - _lastMouseDown.Y) > SystemParameters.MinimumVerticalDragDistance))
{
Canvas canvas = sender as Canvas;
if (canvas.DataContext == null)
{
return;
}
ControlLabware control = (ControlLabware)Utilities.FindLastVisualChild(canvas);
if (control == null || control.IsTrash)
{
return;
}
DragDropAdorner adorner = new DragDropAdorner((UIElement)control);
mAdornerLayer = AdornerLayer.GetAdornerLayer(grid2);
mAdornerLayer.Add(adorner);
LabwareEx labware = canvas.DataContext as LabwareEx;
DataObject data = new DataObject("LabwareEx", labware);
data.SetData("Canvas", canvas);
data.SetData("ControlLabware", control);
DragDrop.DoDragDrop(canvas, data, DragDropEffects.Move);
mAdornerLayer.Remove(adorner);
mAdornerLayer = null;
}
//LoggerHelper.DebugLog(string.Format("===================== Canvas_PreviewMouseMove Canvas.Name = {0}=====================", grid.Name));
}
}
#endregion
private void DoQueryContinueDrag(object sender, QueryContinueDragEventArgs e)
{
Canvas grid = sender as Canvas;
// 挑菌位不可拖动
if (grid != null && grid.Name.Equals(ConfigurationManager.AppSettings["choiceLatticeId"].ToString()))
{
e.Handled = true;
//LoggerHelper.DebugLog(string.Format("===================== DoQueryContinueDrag, Handled = true, Canvas.Name = {0}=====================", grid.Name));
return;
}
if (mAdornerLayer != null)
{
mAdornerLayer.Update();
}
//LoggerHelper.DebugLog(string.Format("===================== DoQueryContinueDrag Canvas.Name = {0}=====================", grid.Name));
}
#region 台面布置单元格 拖放结束
private void Canvas_PreviewDragOver(object sender, DragEventArgs e)
{
Canvas grid = sender as Canvas;
// 挑菌位不可拖动
if (grid.Name.Equals(ConfigurationManager.AppSettings["choiceLatticeId"].ToString()))
{
e.Handled = true;
//LoggerHelper.DebugLog(string.Format("===================== Canvas_PreviewDragOver, Handled = true, Canvas.Name = {0}=====================", grid.Name));
return;
}
if (!e.Data.GetDataPresent("LabwareEx"))
{
e.Effects = DragDropEffects.None;
}
else
{
ControlLabware cl = Utilities.FindVisualChild(grid);
if (cl != null)
{
e.Effects = DragDropEffects.Copy;
}
}
//e.Handled = true;
//LoggerHelper.DebugLog(string.Format("===================== Canvas_PreviewDragOver Canvas.Name = {0}=====================", grid.Name));
}
#endregion
#region 台面布置单元格 尺寸变更
private void Canvas_SizeChanged(object sender, SizeChangedEventArgs e)
{
Canvas canvas = (Canvas)sender;
if (canvas.Children.Count > 0)
{
Border bd = canvas.Children[0] as Border;
bd.Width = canvas.ActualWidth;
bd.Height = canvas.ActualHeight;
//cl.LabwareWidth = canvas.ActualWidth - cl.LabwareDeep;
}
if (canvas.DataContext != null)
{
LabwareEx l = (LabwareEx)canvas.DataContext;
if (string.IsNullOrEmpty(l.labware_type_id))
{
ControlLabware cl = Utilities.FindVisualChild(canvas);
if (cl != null)
{
cl.Width = canvas.ActualWidth;
cl.Height = canvas.ActualHeight;
}
}
else
{
if (canvas.Children.Count > 1)
{
ControlLabware cl = Utilities.FindVisualChild(canvas);
if (cl == null)
{
return;
}
if (l.labware_type_id == EnumManagement.GetEnumValue(ConsumableTypeEnum.CircularDish).ToString()) // 圆形皿
{
cl.LabwareWidth = canvas.ActualWidth;
cl.LabwareHeight = canvas.ActualHeight;
cl.Width = canvas.ActualWidth;
cl.Height = canvas.ActualHeight + 4;
}
else
{
cl.LabwareWidth = canvas.ActualWidth;
cl.LabwareHeight = canvas.ActualHeight;
if (cl.ValidWells != null)
{
string wells = cl.ValidWells;
cl.ValidWells = "";
cl.ValidWells = wells;
}
}
}
}
}
// 挑菌位图片大小适配
if (canvas.Name.Equals(ConfigurationManager.AppSettings["choiceLatticeId"].ToString()))
{
Image img = Utilities.FindVisualChild(canvas);
if (img != null)
{
img.Width = canvas.ActualWidth - 4;
img.Height = canvas.ActualHeight - 23;
}
ControlLabware cl = Utilities.FindVisualChild(canvas);
if (cl != null)
{
cl.LabwareWidth = canvas.ActualWidth - 10;
cl.LabwareHeight = 50;
}
}
}
#endregion
#endregion
#region 耗材一览
#region 耗材点击
private void listviewConsumable_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left)
{
_lastMouseDown = e.GetPosition(listviewConsumable);
}
}
#endregion
#region 耗材移动
private void listviewConsumable_PreviewMouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Point currentPosition = e.GetPosition(listviewConsumable);
if ((Math.Abs(currentPosition.X - _lastMouseDown.X) > SystemParameters.MinimumHorizontalDragDistance)
|| (Math.Abs(currentPosition.Y - _lastMouseDown.Y) > SystemParameters.MinimumVerticalDragDistance))
{
HitTestResult result = VisualTreeHelper.HitTest(listviewConsumable, currentPosition);
if (result == null)
return;
ListViewItem lvi = Utilities.FindVisualParent(result.VisualHit);
if (lvi == null)
return;
if (listviewConsumable.SelectedItem == null)
return;
DragDropAdorner adorner = new DragDropAdorner((UIElement)lvi);
mAdornerLayer = AdornerLayer.GetAdornerLayer(listviewConsumable);
mAdornerLayer.Add(adorner);
Labware lb = listviewConsumable.SelectedItem as Labware;
LabwareEx labwareEx = new LabwareEx(lb);
DataObject data = new DataObject("LabwareEx", labwareEx);
DragDrop.DoDragDrop(lvi, data, DragDropEffects.Copy);
if (mAdornerLayer == null)
mAdornerLayer = AdornerLayer.GetAdornerLayer(listviewConsumable);
{
mAdornerLayer.Remove(adorner);
mAdornerLayer = null;
}
}
}
}
#endregion
#endregion
#region TreeView关联事件
#region 鼠标左键点击前事件
private Point _lastMouseDown;
///
/// 鼠标左键点击前事件
///
///
///
private void treeviewWorkflow_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left)
{
//LoggerHelper.DebugLog("========== PreviewMouseDown ===============");
_lastMouseDown = e.GetPosition(treeviewWorkflow);
IsIgnore = Math.Abs(treeviewWorkflow.ActualWidth - _lastMouseDown.X) < 10 ? true : false;
//treeviewWorkflow.ActualWidth
//Point p = Mouse.GetPosition(e.Source as FrameworkElement);
//Point pp = (e.Source as FrameworkElement).PointToScreen(p);
//Point mousePostion = this.PointToScreen(new Point(this.ActualWidth, this.ActualHeight));
}
}
#endregion
#region 鼠标移动前事件
///
/// 鼠标移动前事件
///
///
///
private void treeviewWorkflow_PreviewMouseMove(object sender, MouseEventArgs e)
{
if (IsIgnore)
{
//LoggerHelper.DebugLog("========== PreviewMouseMove LeftButton Skip ===============");
return;
}
if (e.LeftButton == MouseButtonState.Pressed && !IsIgnore)
{
//LoggerHelper.DebugLog("========== PreviewMouseMove LeftButton Pressed ===============");
Point currentPosition = e.GetPosition(treeviewWorkflow);
//if (sender is TreeView)
//{
// int a = 1;
//}
//if ((Math.Abs(currentPosition.X - _lastMouseDown.X) > SystemParameters.MinimumHorizontalDragDistance)
// || (Math.Abs(currentPosition.Y - _lastMouseDown.Y) > SystemParameters.MinimumVerticalDragDistance))
//{
// HitTestResult result = VisualTreeHelper.HitTest(treeviewWorkflow, currentPosition);
// if (result == null)
// return;
// TreeViewItem tvi = Utilities.FindVisualParent(result.VisualHit);
// if (tvi == null)
// return;
// tvi.IsExpanded = true;
// if (treeviewWorkflow.SelectedItem == null)
// return;
// isDragDrop = true;
// DragDropAdorner adorner = new DragDropAdorner(tvi);
// mAdornerLayer = AdornerLayer.GetAdornerLayer(gridCmdSet);
// mAdornerLayer.Add(adorner);
// DataObject data = new DataObject("MethodEx", treeviewWorkflow.SelectedItem);
// data.SetData("TreeViewItem", tvi);
// DragDrop.DoDragDrop(treeviewWorkflow, data, DragDropEffects.Move);
// if (mAdornerLayer != null)
// {
// mAdornerLayer.Remove(adorner);
// }
// mAdornerLayer = null;
// isDragDrop = false;
//}
if ((Math.Abs(currentPosition.X - _lastMouseDown.X) > SystemParameters.MinimumHorizontalDragDistance)
|| (Math.Abs(currentPosition.Y - _lastMouseDown.Y) > SystemParameters.MinimumVerticalDragDistance))
{
HitTestResult result = VisualTreeHelper.HitTest(treeviewWorkflow, currentPosition);
if (result == null)
return;
TreeViewItem tvi = Utilities.FindVisualParent(result.VisualHit);
if (tvi == null)
return;
tvi.IsExpanded = true;
if (treeviewWorkflow.SelectedItem == null)
return;
isDragDrop = true;
List tviList = new List();
treeViewItems.Clear();
List allTreeViewItemList = Utilities.FindAllVisualChild(treeviewWorkflow);
for (int i=0;i< allTreeViewItemList.Count;i++)
{
if (((MethodEx)allTreeViewItemList[i].Header).isSelected == true)
{
//tviList.Add(allTreeViewItemList[i]);
treeViewItems.Add(allTreeViewItemList[i]);
if (((MethodEx)allTreeViewItemList[i].Header).method_name=="if开始")//加入else
{
GetChildernTreeViewItems(allTreeViewItemList[i+1]);
}
if (treeViewItems.Count > 0)
{
tviList.AddRange(treeViewItems);
treeViewItems.Clear();
}
}
else
{
if (tviList.Contains(allTreeViewItemList[i]))
{
continue;
}
else
{
GetChildernTreeViewItems(allTreeViewItemList[i]);
}
if (treeViewItems.Count > 0)
{
tviList.AddRange(treeViewItems);
treeViewItems.Clear();
}
}
}
DragDropAdorner adorner = new DragDropAdorner(tviList[0], tviList);
mAdornerLayer = AdornerLayer.GetAdornerLayer(gridCmdSet);
mAdornerLayer.Add(adorner);
SelectedItemList.Clear();
//把已经选中的也要加进来
List methodExes = FindMethodExBySelected(rootMethod);
SelectedItemList.AddRange(methodExes);
DataObject data = new DataObject("MethodEx", SelectedItemList);
data.SetData("TreeViewItem", tviList);
DragDrop.DoDragDrop(treeviewWorkflow, data, DragDropEffects.Move);
if (mAdornerLayer != null)
{
mAdornerLayer.Remove(adorner);
}
mAdornerLayer = null;
isDragDrop = false;
}
}
}
#endregion
List treeViewItems = new List();// 拖动时临时存储带拖动的条目数据
#region 递归获取拖动的条目对象
///
/// 递归获取拖动的条目对象
///
/// 要递归的当前条目
private void GetChildernTreeViewItems(TreeViewItem treeViewItem)
{
if (treeViewItem!=null)
{
if (((MethodEx)treeViewItem.Header).Children != null)
{
if (((MethodEx)treeViewItem.Header).isSelected==true)//((MethodEx)treeViewItem.Header).method_name == "if开始"&&
{
treeViewItems.Add(treeViewItem);
}
else if (((MethodEx)treeViewItem.Header).method_name == "else开始")
{
if (IsExistParentIf(treeViewItem))
{
treeViewItems.Add(treeViewItem);
}
else
{
List subTreeViewItemList = Utilities.FindAllVisualChild(treeViewItem);
foreach (TreeViewItem t in subTreeViewItemList)
{
GetChildernTreeViewItems(t);
}
}
}
else
{
List subTreeViewItemList = Utilities.FindAllVisualChild(treeViewItem);
foreach (TreeViewItem t in subTreeViewItemList)
{
GetChildernTreeViewItems(t);
}
}
}
else
{
if (((MethodEx)treeViewItem.Header).isSelected == true)//((MethodEx)treeViewItem.Header).method_name == "if开始" &&
{
treeViewItems.Add(treeViewItem);
}
else if (((MethodEx)treeViewItem.Header).method_name == "else开始")
{
if (IsExistParentIf(treeViewItem))
{
treeViewItems.Add(treeViewItem);
}
else
{
List subTreeViewItemList = Utilities.FindAllVisualChild(treeViewItem);
foreach (TreeViewItem t in subTreeViewItemList)
{
GetChildernTreeViewItems(t);
}
}
}
}
}
}
#endregion
#region 判断else对应的if是否已经选中成为拖动数据
///
/// 判断else对应的if是否已经选中成为拖动数据
///
/// else对应的TreeViewItem
///
private bool IsExistParentIf(TreeViewItem treeViewItem)
{
bool result = false;
if(treeViewItems!=null&& treeViewItems.Count>0)
{
string indexName = ((MethodEx)treeViewItem.Header).strIndex;
string indexOfIf = string.Empty;
if (indexName.Contains("-"))
{
string heardOfIndex = indexName.Substring(0, indexName.LastIndexOf("-"));
string nextOfIndex = indexName.Substring(indexName.LastIndexOf("-") + 1, indexName.Length - indexName.LastIndexOf("-") - 1);
indexOfIf = (heardOfIndex + "-" + (Convert.ToInt32(nextOfIndex) - 1)).ToString();
}
else
{
indexOfIf = (Convert.ToInt32(indexName) - 1).ToString();
}
foreach (TreeViewItem t in treeViewItems)
{
if(((MethodEx)t.Header).strIndex==indexOfIf)
{
result = true;
break;
}
}
}
return result;
}
#endregion
#region 拖动事件
///
/// 开始拖动前
///
///
///
private void treeviewWorkflow_PreviewDragOver(object sender, DragEventArgs e)
{
if (IsIgnore)
{
//LoggerHelper.DebugLog("========== PreviewDragOver Skip ===============");
return;
}
//LoggerHelper.DebugLog("========== PreviewDragOver ===============");
if (!e.Data.GetDataPresent("MethodEx"))
{
e.Effects = DragDropEffects.None;
}
else
{
List miList = e.Data.GetData("MethodEx") as List;
if (miList == null)
{
MethodEx mi = e.Data.GetData("MethodEx") as MethodEx;
if (!mi.Moveable)
e.Effects = DragDropEffects.None;
else
{
Point pos = e.GetPosition(treeviewWorkflow);
HitTestResult result = VisualTreeHelper.HitTest(treeviewWorkflow, pos);
if (result == null)
return;
TreeViewItem targetItem = Utilities.FindVisualParent(result.VisualHit);
if (targetItem == null)
return;
targetItem.IsSelected = true;
MethodEx targetData = targetItem.DataContext as MethodEx;
if (!targetData.canDrop)
{
e.Effects = DragDropEffects.None;
}
else if (e.Effects == DragDropEffects.Move)
{
if (mi == targetData)
{
e.Effects = DragDropEffects.None;
}
else
{
bool check = CheckSourceHasTarget(mi, targetData);
if (check)
e.Effects = DragDropEffects.None;
}
}
}
}
else
{
foreach (MethodEx mi in miList)
{
if (!mi.Moveable)
{
e.Effects = DragDropEffects.None;
}
else
{
Point pos = e.GetPosition(treeviewWorkflow);
HitTestResult result = VisualTreeHelper.HitTest(treeviewWorkflow, pos);
if (result == null)
return;
TreeViewItem targetItem = Utilities.FindVisualParent(result.VisualHit);
if (targetItem == null)
return;
targetItem.IsSelected = true;
MethodEx targetData = targetItem.DataContext as MethodEx;
if (!targetData.canDrop)
{
e.Effects = DragDropEffects.None;
}
else if (e.Effects == DragDropEffects.Move)
{
if (mi == targetData)
{
e.Effects = DragDropEffects.None;
}
else
{
bool check = CheckSourceHasTarget(mi, targetData);
if (check)
e.Effects = DragDropEffects.None;
}
}
}
}
}
}
e.Handled = true;
}
///
/// 开始拖动
///
///
///
private void treeviewWorkflow_DragOver(object sender, DragEventArgs e)
{
if (IsIgnore)
{
//LoggerHelper.DebugLog("========== DragOver Skip ===============");
return;
}
//LoggerHelper.DebugLog("========== DragOver ===============");
e.Effects = DragDropEffects.None;
Point pos = e.GetPosition(treeviewWorkflow);
HitTestResult result = VisualTreeHelper.HitTest(treeviewWorkflow, pos);
if (result == null)
return;
TreeViewItem selectedItem = Utilities.FindVisualParent(result.VisualHit);
if (selectedItem != null)
selectedItem.IsSelected = true;
e.Effects = DragDropEffects.Copy;
}
#endregion
#region 拖动放下事件
///
/// 拖动放下(鼠标松开)
///
///
///
private void treeviewWorkflow_Drop(object sender, DragEventArgs e)
{
if (IsIgnore)
{
//LoggerHelper.DebugLog("========== Drop Skip ===============");
return;
}
//LoggerHelper.DebugLog("========== Drop ===============");
Point pos = e.GetPosition(treeviewWorkflow);
HitTestResult result = VisualTreeHelper.HitTest(treeviewWorkflow, pos);
if (result == null)
return;
TreeViewItem selectedItem = Utilities.FindVisualParent(result.VisualHit);
if (selectedItem == null)
return;
MethodEx targetItem = selectedItem.Header as MethodEx;
mainWindow.SetObserverNode(rootMethod);//注册观察者
List dragItemList = e.Data.GetData("MethodEx") as List;
bool currentItemIsTimer = false;//判断当前拖入的节点是否是timer
if (dragItemList == null) //流程外新拖入
{
MethodEx dragItem = e.Data.GetData("MethodEx") as MethodEx;
if (targetItem != null && dragItem != null)
{
//判断下目标条目是否是if结束,目标条目的下一个条目是否是else开始,如果满足条件不能拖入
bool mResult = IsDrogIntoIfendMidElseStart(targetItem);
if(mResult)
{
return;
}
if (e.Effects == DragDropEffects.Copy)
InsertIntoWorkflow(dragItem, targetItem, selectedItem.IsExpanded);
else if (e.Effects == DragDropEffects.Move)
{
MoveWorkflowItem(dragItem, targetItem);
}
if(dragItem.method_name.Equals("计时器"))
{
currentItemIsTimer = true;
}
ReOrderMethodIndex("", rootMethod);
//更新下Waitfor 中的Timer
//this.UpdateWaitFor(dragItem);
}
targetItem.isSelected = false;
if (curSelectedMethod != null)
curSelectedMethod.isSelected = true;
}
else //流程内重排
{
for (int i= 0;i < dragItemList.Count;i++)
{
//if (dragItem.method_type == 2 && targetItem.method_type == 2 && targetItem.Children.Count > 0)
// return;
if (targetItem != null && dragItemList[i] != null)
{
//判断下目标条目是否是if结束,目标条目的下一个条目是否是else开始,如果满足条件不能拖入
bool mResult = IsDrogIntoIfendMidElseStart(targetItem);
if (mResult)
{
return;
}
if (e.Effects == DragDropEffects.Copy)
InsertIntoWorkflow(dragItemList[i], targetItem);
else if (e.Effects == DragDropEffects.Move)
{
MoveWorkflowItem(dragItemList[i], targetItem,i);
}
if (dragItemList[i].method_name.Equals("计时器"))
{
currentItemIsTimer = true;
}
ReOrderMethodIndex("", rootMethod);
if (dragItemList[i].method_name.Equals("等待"))
{
//更新下Waitfor 中的Timer
//this.UpdateWaitFor(dragItemList[i]);
}
}
targetItem.isSelected = false;
if (curSelectedMethod != null)
curSelectedMethod.isSelected = true;
}
}
//更新下Waitfor 中的Timer
//当前拖入的节点看是否包含timer,包含就更新,不包含就不更新
if (currentItemIsTimer)
{
updateWaitforOnWorkflow();
}
}
#endregion
#region 鼠标右键点击事件 ignore
///
/// 鼠标右键点击
///
///
///
private void treeviewWorkflow_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
DependencyObject source = e.OriginalSource as DependencyObject;
while (source != null && source.GetType() != typeof(TreeViewItem))
source = System.Windows.Media.VisualTreeHelper.GetParent(source);
if (source != null)
{
TreeViewItem item = source as TreeViewItem;
item.IsSelected = true;
MethodEx method = item.DataContext as MethodEx;
ContextMenu menu = FindResource("workflowMenu") as ContextMenu;
// 开始、台面布置、结束
if ((method.method_id == "0") ||
(method.method_id == "1") ||
(method.method_id == "2"))
{
MenuItem menuItem = menu.Items[0] as MenuItem;
menuItem.IsEnabled = false;
menuItem = menu.Items[2] as MenuItem;
menuItem.IsEnabled = false;
menuItem = menu.Items[3] as MenuItem;
menuItem.IsEnabled = false;
// 开始、结束
if ((method.method_id == "0") || (method.method_id == "2"))
{
menuItem = menu.Items[1] as MenuItem;
menuItem.IsEnabled = false;
}
else if (copyMethod == null)
{
menuItem = menu.Items[1] as MenuItem;
menuItem.IsEnabled = false;
}
else
{
menuItem = menu.Items[1] as MenuItem;
menuItem.IsEnabled = true;
}
}
else
{
MenuItem menuItem = menu.Items[0] as MenuItem;
menuItem.IsEnabled = true;
if (copyMethod == null)
{
menuItem = menu.Items[1] as MenuItem;
menuItem.IsEnabled = false;
}
else
{
menuItem = menu.Items[1] as MenuItem;
menuItem.IsEnabled = true;
}
menuItem = menu.Items[3] as MenuItem;
menuItem.IsEnabled = true;
menuItem = menu.Items[2] as MenuItem;
menuItem.IsEnabled = true;
if (method.isEnabled)
menuItem.Header = Properties.Resources.strDisable;
else
menuItem.Header = Properties.Resources.strEnable;
}
int a = 0;
IsIgnore = true;
}
}
#endregion
#region 查找Tree中已经选中的节点
private List FindMethodExBySelected(MethodEx method)
{
List methodExes = new List();
if (method.isSelected == true)
{
if (method.method_name != "开始" || method.method_name != "台面布置" || method.method_name != "结束")
{
methodExes.Add(method);
if (method.method_name == "if开始")//把可能存在的else也加进来
{
string indexName = method.strIndex;
string indexOfElse = string.Empty;
MethodEx methodExElse = null;
if (indexName.Contains("-"))
{
string heardOfIndex = indexName.Substring(0, indexName.LastIndexOf("-"));
string nextOfIndex = indexName.Substring(indexName.LastIndexOf("-") + 1, indexName.Length - indexName.LastIndexOf("-") - 1);
indexOfElse = (heardOfIndex + "-" + (Convert.ToInt32(nextOfIndex) + 1)).ToString();
methodExElse = SetRunningStatus(indexOfElse);
}
else
{
indexOfElse = (Convert.ToInt32(indexName) + 1).ToString();
methodExElse = SetRunningStatus(indexOfElse);
}
//if (methodExElse != null)
//{
// methodExes.Add(methodExElse);
//}
}
}
}
else
{
if (method.Children.Count > 0)
{
foreach (var m in method.Children)
{
List find = FindMethodExBySelected(m);
if (find != null && find.Count != 0)
{
methodExes.AddRange(find);
}
}
}
}
return methodExes;
}
#endregion
public static ScrollViewer GetScrollViewer(DependencyObject depObj)
{
if (depObj is ScrollViewer)
return depObj as ScrollViewer;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
var child = VisualTreeHelper.GetChild(depObj, i);
var result = GetScrollViewer(child);
if (result != null)
return result;
}
return null;
}
public List SelectedItemList = new List();
private MethodEx curSelectedMethod = null;
private void treeviewWorkflow_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs