void ucEquip_MouseMove(object sender, MouseEventArgs e) { if (isMove) { UCEquipIcon uc = e.Source as UCEquipIcon; Point p = e.GetPosition(this);//获取鼠标移动中的相对窗体坐标 double x = preMousePoint.X + (p.X - preObjectPoint.X); double y = preMousePoint.Y + (p.Y - preObjectPoint.Y); if (x > canvas.ActualWidth - uc.ActualWidth) { x = canvas.ActualWidth - uc.ActualWidth; } if (x < 0) { x = 0; } if (y > canvas.ActualHeight - uc.ActualHeight) { y = canvas.ActualHeight - uc.ActualHeight; } if (y < 0) { y = 0; } Canvas.SetLeft(uc, x); Canvas.SetTop(uc, y); } }
private void InitDrawEquip(EquipType equipType) { if (drawItem != null) { canvas.Children.Remove(drawItem as UCEquipIcon); drawItem = null; } UCEquipIcon ucEquip = new UCEquipIcon(); Binding bindWidth = new Binding() { Path = new PropertyPath("UCEquipLength"), Source = this }; bindWidth.Converter = new PicWidthToUCWidthConverter(); Binding bindHeight = new Binding() { Path = new PropertyPath("UCEquipLength"), Source = this }; bindHeight.Converter = new PicHeightToUCHeightConverter(); ucEquip.SetBinding(UCEquipIcon.WidthProperty, bindWidth); ucEquip.SetBinding(UCEquipIcon.HeightProperty, bindHeight); Equipment equip = new Equipment(); ucEquip.Equip = equip; equip.Type = equipType; ucEquip.Visibility = Visibility.Hidden; drawItem = ucEquip; canvas.Children.Add(ucEquip as UCEquipIcon); }
private void canvas_MouseMove(object sender, MouseEventArgs e) { if (drawItem != null) { if (drawItem.GetType() == typeof(UCEquipIcon)) { UCEquipIcon element = drawItem as UCEquipIcon; element.Visibility = Visibility.Visible; Canvas.SetLeft(element, e.GetPosition(canvas).X - 25); Canvas.SetTop(element, e.GetPosition(canvas).Y + 5); } else //除了UCEquipIcon就是线 { canvas.Cursor = Cursors.Pen; } } }
void ucEquip_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { UCEquipIcon uc = e.Source as UCEquipIcon; if (drawItem == null) //不在画图状态,选定此设备,移动物体准备 { if (selectedItem == null) { selectedItem = uc; uc.IsSelected = true; } else if (selectedItem == uc) { } else { if (selectedItem.GetType().Equals(typeof(UCEquipIcon))) { (selectedItem as UCEquipIcon).IsSelected = false; } else { (selectedItem as Line).StrokeThickness = 2d; } selectedItem = uc; uc.IsSelected = true; } preObjectPoint = e.GetPosition(this); //获取点击前鼠标相对窗体坐标 preMousePoint = new Point(Canvas.GetLeft(uc), Canvas.GetTop(uc)); //获取点击前物体的坐标 isMove = true; //开始移动了 canvas.Cursor = Cursors.SizeAll; uc.CaptureMouse(); //鼠标捕获此圆 } else //画图状态,只有画线起作用 { } e.Handled = true; }
void ucEquip_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { if (isMove) { UCEquipIcon uc = e.Source as UCEquipIcon; isMove = false; //结束移动了 canvas.Cursor = Cursors.Arrow; uc.ReleaseMouseCapture(); //鼠标释放此圆 //考虑在移动最后结束的时候,将数据库中有的设备(index>0)坐标变化及时写入数据库 if (App.databaseConState == true && uc.Equip.Index > 0) { Equipment equip = uc.Equip; int id = equip.Index; double x = equip.X; double y = equip.Y; if (App.idAndEquipList.ContainsKey(id)) { App.idAndEquipList[id].X = x; App.idAndEquipList[id].Y = y; } else { tbStatusMessage.Text = "App.idAndEquipList全局列表不包含此设备"; } if (App.DBHelper.ExecuteReturnBool(string.Format("UPDATE Equipments SET Equip_X = {0},Equip_Y = {1} WHERE Equip_Index = {2}", x, y, id))) { tbStatusMessage.Text = string.Format("{0}位置更新 {1},{2}", equip.Name, x, y); } else { tbStatusMessage.Text = equip.Name + "位置更新失败"; } } } }
/// <summary> /// 根据设备类信息和上个设备图标信息来生成本设备图标并定位 /// </summary> /// <param name="equip"></param> /// <param name="ucLastEquip"></param> /// <returns></returns> private UCEquipIcon GetUCEquipIcon(Equipment equip) { //将图标长宽绑定到程序设置的UCEquipLength变量上来,这个变量后面可以让用户调节 Binding bindWidth = new Binding() { Path = new PropertyPath("UCEquipLength"), Source = this }; bindWidth.Converter = new PicWidthToUCWidthConverter(); Binding bindHeight = new Binding() { Path = new PropertyPath("UCEquipLength"), Source = this }; bindHeight.Converter = new PicHeightToUCHeightConverter(); //图标控件的坐标绑定到设备类的坐标上 Binding bindX = new Binding { Path = new PropertyPath("X"), Source = equip, Mode = BindingMode.TwoWay }; Binding bindY = new Binding { Path = new PropertyPath("Y"), Source = equip, Mode = BindingMode.TwoWay }; //图标控件的中心点绑定到设备类的坐标上 Binding bindCenterX = new Binding { Path = new PropertyPath("X"), Source = equip }; bindCenterX.Converter = new PointToCenterPointConverter(); bindCenterX.ConverterParameter = ucEquipLength; Binding bindCenterY = new Binding { Path = new PropertyPath("Y"), Source = equip }; bindCenterY.Converter = new PointYToCenterPointYConverter(); bindCenterY.ConverterParameter = ucEquipLength; UCEquipIcon ucEquipIcon = null; this.Dispatcher.Invoke(new Action(() => { ucEquipIcon = new UCEquipIcon(); ucEquipIcon.SetBinding(UCEquipIcon.WidthProperty, bindWidth); ucEquipIcon.SetBinding(UCEquipIcon.HeightProperty, bindHeight); ucEquipIcon.SetBinding(Canvas.LeftProperty, bindX); ucEquipIcon.SetBinding(Canvas.TopProperty, bindY); ucEquipIcon.SetBinding(UCEquipIcon.CenterPointXProperty, bindCenterX); ucEquipIcon.SetBinding(UCEquipIcon.CenterPointYProperty, bindCenterY); canvas.Children.Add(ucEquipIcon); })); //图标控件和设备类互相引用 ucEquipIcon.Equip = equip; equip.UCEquipIcon = ucEquipIcon; //图标控件的属性和事件 ucEquipIcon.MouseLeftButtonDown += new MouseButtonEventHandler(ucEquip_MouseLeftButtonDown); ucEquipIcon.MouseMove += new MouseEventHandler(ucEquip_MouseMove); ucEquipIcon.MouseLeftButtonUp += new MouseButtonEventHandler(ucEquip_MouseLeftButtonUp); ucEquipIcon.MouseRightButtonDown += new MouseButtonEventHandler(ucEquip_MouseRightButtonDown); return(ucEquipIcon); }
/// <summary> /// 探测网络拓扑全过程,应该要在新线程中工作,后面改 /// </summary> private void StartDetecNetwork(Object stateInfo) { string strIP; VbCollection equipInfo; AddMessage("网络拓扑探测和绘制开始"); while (WaitForDetectList.Count > 0) { if (!isDetecting) { AddMessage("网络拓扑探测和绘制被强制结束"); return; } WaitForDetectInfomation waitInfo = WaitForDetectList[0]; IpAddress ip = waitInfo.Ip; Equipment lastEquip = waitInfo.Equip; int step = waitInfo.Step; WaitForDetectList.RemoveAt(0); //需要获取的单个snmp变量信息包括设备描述、objectid(enterprises.311.1.1.3.1.2,可用来判断设备厂家,待验证) /*objectid验证整理 enterprises = 1.3.6.1.4.1 * 虚拟机2003操作系统:enterprises.311.1.1.3.1.2 */ if (ipAlreadyFindList.ContainsKey(ip)) { //这里应该不可能执行到,试一下 // MessageBox.Show("这里应该不可能执行到,试一下"); // continue; //下一跳设备已经存在,只画线即可 if (ipAlreadyFindList[ip].Equip.AdminIPAddress.ToString() == "67.250.5.1" && lastEquip.AdminIPAddress.ToString() == "3.250.5.1") { } DrawLine(ipAlreadyFindList[ip].Equip, lastEquip); AddMessage("直接画线" + ip.ToString() + "到" + lastEquip.AdminIPAddress.ToString()); continue; } equipInfo = SnmpHelper.GetResultsFromOids(ip, equipInfoRequestOids, out tipMessage); if (equipInfo == null) { AddMessage(string.Format("出错,错误信息:{0}", tipMessage)); AddMessage(string.Format("SNMP获取ip:{0}设备system信息失败,进入下一轮", ip.ToString())); continue; } string sysDescr = equipInfo[0].Value.ToString(); string sysObjectID = equipInfo[1].Value.ToString(); byte sysServices = Convert.ToByte(equipInfo[2].Value.ToString());//可以根据此值尝试获取设备类型,当数据库中没有值的时候使用此猜测值。 //开始建立ucequip,equipment,搜索静态列表是否有这个设备,取得名字等信息 strIP = ip.ToString(); Equipment equip = GetEquipment(strIP, sysDescr, lastEquip); equip.EquipBrand = SnmpHelper.GetBrandFromObjectID(sysObjectID); if (equip == null) { AddMessage(string.Format("SNMP获取ip:{0}设备信息失败,进入下一轮", strIP)); continue; } equipAlreadyFindList.Add(equip.Index, equip); AddMessage("发现设备信息,设备名称:" + equip.Name); UCEquipIcon ucEquipIcon = GetUCEquipIcon(equip); if (ucEquipIcon == null) { AddMessage(string.Format("添加设备{0}图标、定位失败,进入下一轮", strIP)); continue; } AddMessage(string.Format("添加设备图标,坐标x:{0},y:{1}", equip.X, equip.Y)); //GetTextBlock(ucEquipIcon); FilterRouteInfo(equip, step); if (equip.AdminIPAddress.ToString() == "67.250.5.1" && lastEquip.AdminIPAddress.ToString() == "3.250.5.1") { } if (lastEquip != null) { DrawLine(equip, lastEquip); } } IsDetecting = false; AddMessage("网络拓扑发现和绘制完毕"); }