void textBox_TextChange(object sender, TextChangedEventArgs e) { ChangeTextBox = sender as TextBox; var textBoxNamevar = from t in textBoxDic where t.Value == ChangeTextBox select t.Key; string textBoxName = textBoxNamevar.FirstOrDefault(); ClassLibrary_Graph.Node <string> node1 = new ClassLibrary_Graph.Node <string>(arrowDic[textBoxName].Tail); ClassLibrary_Graph.Node <string> node2 = new ClassLibrary_Graph.Node <string>(arrowDic[textBoxName].Head); graph.ChangeEdgeWei(node1, node2, int.Parse(ChangeTextBox.Text)); }
protected override void OnMouseUp(MouseButtonEventArgs e) { base.OnMouseUp(e); if (IsDrawing && e.ChangedButton == MouseButton.Left) { IsDrawing = false; ReleaseMouseCapture(); } else if (IsDragging && e.ChangedButton == MouseButton.Right) { IsDragging = false; } else if (!IsInGrid && IsConnecting && e.ChangedButton == MouseButton.Left) {//未在圆内释放 IsConnecting = false; this.GraphShowCanvas.Children.Remove(arrow); } else if (IsInGrid && IsConnecting && e.ChangedButton == MouseButton.Left) {//在圆内释放 IsConnecting = false; arrow.Head = ChangeGrid.Name; if (arrow.Tail == arrow.Head) {//起始点同圆,箭头失效 this.GraphShowCanvas.Children.Remove(arrow); } else {//将arrow添加arrowDic中 string arrowName = arrow.Tail + "-" + arrow.Head; if (arrowDic.ContainsKey(arrowName)) {//已经存在从此尾到此头的箭头 this.GraphShowCanvas.Children.Remove(arrow); } else { //将箭头添加到arrowDic和Graph中 arrowDic.Add(arrowName, arrow); ClassLibrary_Graph.Node <string> node1 = new ClassLibrary_Graph.Node <string>(arrow.Tail); ClassLibrary_Graph.Node <string> node2 = new ClassLibrary_Graph.Node <string>(arrow.Head); graph.SetEdge(node1, node2, 1); //textbox用于输入权值 TextBox textBox = new TextBox(); textBoxDic.Add(arrowName, textBox); this.GraphShowCanvas.Children.Add(textBox); Canvas.SetLeft(textBox, (arrow.X1 + arrow.X2) / 2); Canvas.SetTop(textBox, (arrow.Y1 + arrow.Y2) / 2); //添加路由事件,当textbox内容改变时,同时改变这条边的权值 textBox.TextChanged += new TextChangedEventHandler(textBox_TextChange);; } } } }
public void DelGrid(string delName) { //删除圆 this.GraphShowCanvas.Children.Remove(gridDic[delName]); gridDic.Remove(delName); ClassLibrary_Graph.Node <string> node = new ClassLibrary_Graph.Node <string>(delName); graph.DelNode(node); //删除相关的连线及textBox //以其为尾的arrow: string prefix = delName + "-"; List <string> DelKeys = new List <string>();//由于在foreach循环中无法使用remove,需要循环后再删除 foreach (string Key in arrowDic.Keys) { if (Key.StartsWith(prefix)) { DelKeys.Add(Key); } } foreach (string delKey in DelKeys) { this.GraphShowCanvas.Children.Remove(arrowDic[delKey]); arrowDic.Remove(delKey); this.GraphShowCanvas.Children.Remove(textBoxDic[delKey]); textBoxDic.Remove(delKey); } DelKeys.Clear(); //以其为头的arrow string suffix = "-" + delName; foreach (string Key in arrowDic.Keys) { if (Key.EndsWith(suffix)) { DelKeys.Add(Key); } } foreach (string delKey in DelKeys) { this.GraphShowCanvas.Children.Remove(arrowDic[delKey]); arrowDic.Remove(delKey); this.GraphShowCanvas.Children.Remove(textBoxDic[delKey]); textBoxDic.Remove(delKey); } }
//双击右键删除圆或箭头 protected override void OnMouseDoubleClick(MouseButtonEventArgs e) { base.OnMouseDoubleClick(e); if (e.ChangedButton == MouseButton.Right && IsInGrid == true) { DelGrid(ChangeGrid.Name); ////删除圆 //gridDic.Remove(ChangeGrid.Name); //this.GraphShowCanvas.Children.Remove(ChangeGrid); //ClassLibrary_Graph.Node<string> node = new ClassLibrary_Graph.Node<string>(ChangeGrid.Name); //graph.DelNode(node); ////删除相关的连线及textBox ////以其为尾的arrow: //string prefix = ChangeGrid.Name + "-"; //List<string> DelKeys = new List<string>();//由于在foreach循环中无法使用remove,需要循环后再删除 ////ClassLibrary_Graph.Node<string> node1 = new ClassLibrary_Graph.Node<string>("0"); ////ClassLibrary_Graph.Node<string> node2 = new ClassLibrary_Graph.Node<string>("0"); //foreach (string Key in arrowDic.Keys) //{ // if (Key.StartsWith(prefix)) // { // DelKeys.Add(Key); // } //} ////node1.Data = ChangeGrid.Name; //foreach (string delKey in DelKeys) //{ // //node2.Data = arrowDic[delKey].Head; // //Graph.DelEdge(node1, node2);//Graph类里删除顶点不用再删除边 // this.GraphShowCanvas.Children.Remove(arrowDic[delKey]); // arrowDic.Remove(delKey); // this.GraphShowCanvas.Children.Remove(textBoxDic[delKey]); // textBoxDic.Remove(delKey); //} //DelKeys.Clear(); ////以其为头的arrow //string suffix = "-" + ChangeGrid.Name; //foreach (string Key in arrowDic.Keys) //{ // if (Key.EndsWith(suffix)) // { // DelKeys.Add(Key); // } //} ////node2.Data = ChangeGrid.Name; //foreach (string delKey in DelKeys) //{ // //node1.Data = arrowDic[delKey].Tail; // //Graph.DelEdge(node1, node2); // this.GraphShowCanvas.Children.Remove(arrowDic[delKey]); // arrowDic.Remove(delKey); // this.GraphShowCanvas.Children.Remove(textBoxDic[delKey]); // textBoxDic.Remove(delKey); //} } else if (e.ChangedButton == MouseButton.Right && IsInArrow == true) {//删除箭头 ClassLibrary_Graph.Node <string> node1 = new ClassLibrary_Graph.Node <string>(ChangeArrow.Tail); ClassLibrary_Graph.Node <string> node2 = new ClassLibrary_Graph.Node <string>(ChangeArrow.Head); graph.DelEdge(node1, node2); string arrowName = ChangeArrow.Tail + "-" + ChangeArrow.Head; arrowDic.Remove(arrowName); this.GraphShowCanvas.Children.Remove(ChangeArrow); //删除textBox this.GraphShowCanvas.Children.Remove(textBoxDic[arrowName]); textBoxDic.Remove(arrowName); } }
//点击左键,定义圆的圆心并绘制 protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { //执行基本的方法 base.OnMouseLeftButtonDown(e); //连箭头 if (IsInGrid == true) { arrow = new ClassLibrary_Graph.Arrow(); arrow.HeadHeight = 10; arrow.HeadWidth = 10; arrow.Stroke = Brushes.Black; arrow.StrokeThickness = 3; arrow.Tail = ChangeGrid.Name; arrow.X1 = Canvas.GetLeft(ChangeGrid) + ChangeGrid.Width / 2;//箭尾为所在圆的圆心 arrow.Y1 = Canvas.GetTop(ChangeGrid) + ChangeGrid.Height / 2; //添加路由事件 arrow.MouseEnter += new MouseEventHandler(arrow_MouseEnter); arrow.MouseLeave += new MouseEventHandler(arrow_MouseLeave); IsConnecting = true; IsSettingArrow = true; return; } //对箭头进行左击,不添加新圆 if (IsInArrow == true) { return; } //创建一个grid对象,存放圆与标签 grid = new Grid(); grid.Width = 40; grid.Height = 40; ptcenter = e.GetPosition(this.GraphShowCanvas);//返回相对canvas的点位置 grid.Name = pointNames[pointNamesNum]; //创建一个Ellipse对象,并且把它加入到grid中 elips = new Ellipse();//新建一个椭圆对象 elips.Stroke = SystemColors.WindowTextBrush; elips.Width = 40; elips.Height = 40;//固定直径为40 elips.Fill = Brushes.White; grid.Children.Add(elips); //创建一个label对象,并把它加入grid中 label = new Label(); label.Content = pointNames[pointNamesNum++]; label.HorizontalAlignment = HorizontalAlignment.Center;//居中 label.VerticalAlignment = VerticalAlignment.Center; grid.Children.Add(label); //添加路由事件 grid.MouseEnter += new MouseEventHandler(grid_MouseEnter); grid.MouseLeave += new MouseEventHandler(grid_MouseLeave); grid.MouseRightButtonDown += new MouseButtonEventHandler(grid_MouseRightButtonDown); //grid添加到Canvas和gridDic和Graph中 this.GraphShowCanvas.Children.Add(grid); gridDic.Add(grid.Name, grid); Panel.SetZIndex(grid, 1); Canvas.SetLeft(grid, ptcenter.X - grid.Width / 2);//ptcenter的(x,y)为elips的圆心坐标 Canvas.SetTop(grid, ptcenter.Y - grid.Height / 2); ClassLibrary_Graph.Node <string> node = new ClassLibrary_Graph.Node <string>(label.Content.ToString()); graph.SetNode(node); //获取鼠标,即使鼠标离开区域也可获取鼠标消息 CaptureMouse(); IsDrawing = true; }