コード例 #1
0
        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));
        }
コード例 #2
0
        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);;
                    }
                }
            }
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
        //双击右键删除圆或箭头
        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);
            }
        }
コード例 #5
0
        //点击左键,定义圆的圆心并绘制
        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;
        }