private void Button_Click(object sender, RoutedEventArgs e)
        {
            using (DiagramRenderLock diagramLock = new DiagramRenderLock(MyDiagram))
            {
                DiagramNode node = new DiagramNode(MyDiagram);
                node.Bounds = new Rect(50, 50, 50, 50);
                node.Background = new SolidColorBrush(Colors.Azure);
                node.RadiusX = 15;
                node.RadiusY = 15;
                node.Drawer = new RoundedRectangleItemDrawer();
                node.Label.Text = "AAZzzффффф";
                node.Label.Foreground = new SolidColorBrush(Colors.DarkRed);
                node.Label.FontStyle = FontStyles.Italic;

                DiagramNode node1 = new DiagramNode(MyDiagram);
                node1.Bounds = new Rect(75, 200, 50, 50);
                node1.Background = new SolidColorBrush(Colors.Violet);
                node1.Label.Text = "wow";
                LinearGradientBrush brush = new LinearGradientBrush();
                brush.GradientStops.Add(new GradientStop(Colors.White, 0));
                brush.GradientStops.Add(new GradientStop(Colors.Blue, 1));
                brush.Opacity = 0.5;
                node1.Label.Background = brush;
                node1.Label.BorderPen = new Pen(Brushes.BlanchedAlmond, 2);

                //DiagramEdge edge = new DiagramEdge(MyDiagram);
                //edge.SourcePoint = new Point(100, 100);
                //edge.DestinationPoint = new Point(150, 150);
                //edge.Label.Text = "lololol";
                //edge.Label.Background = brush;

                //DiagramEdge edge1 = new DiagramEdge(MyDiagram);
                //edge1.AnchoringMode = EdgeAnchoringMode.NodeToNode;
                //edge1.SourceNode = node;
                //edge1.DestinationNode = node1;
            }
        }
        public void ZoomOut(Point point)
        {
            using (var diagramLock = new DiagramRenderLock(this))
            {
                double oldScale = Scale;
                Rect oldViewport = Viewport;

                ZoomOut();

                DoOffsetAfterZoom(point);
            }
        }
        public void ZoomIn(Point point)
        {
            using (var diagramLock = new DiagramRenderLock(this))
            {
                ZoomIn();

                DoOffsetAfterZoom(point);
            }
        }
        private void MoveViewport(Point mousePosition)
        {
            if (_rightButtonDownMousePosition == null)
                return;

            if (_diagram.Cursor != Cursors.SizeAll)
                _diagram.Cursor = Cursors.SizeAll;

            mousePosition.X += _diagram.XViewOffset - _baseXViewOffset;
            mousePosition.Y += _diagram.YViewOffset - _baseYViewOffset;

            using (DiagramRenderLock diagramLock = new DiagramRenderLock(_diagram))
            {
                _diagram.XViewOffset = _baseXViewOffset + mousePosition.X - _rightButtonDownMousePosition.Value.X;
                _diagram.YViewOffset = _baseYViewOffset + mousePosition.Y - _rightButtonDownMousePosition.Value.Y;
            }
        }
        protected void CheckOffsets(object sender, DoWorkEventArgs args)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            if (worker == null)
                return;

            if (!_leftButtonDown)
                return;

            while (true)
            {
                if (worker.CancellationPending == true)
                    break;

                _diagram.Dispatcher.Invoke((Action)(() =>
                    {
                        Rect viewport = _diagram.Viewport;
                        Point currentPoint = _currentMousePosition.Value;
                        Point currentScreenPoint = currentPoint.ToDisplayPoint(_diagram.Offset, _diagram.Scale);

                        bool moveUp = false;
                        bool moveDown = false;
                        bool moveLeft = false;
                        bool moveRight = false;

                        double offsetX = viewport.Width * 0.05;
                        double offsetY = viewport.Height * 0.05;

                        if (currentPoint.X - viewport.Left < offsetX)
                            moveLeft = true;

                        if (viewport.Right - currentPoint.X < offsetX)
                            moveRight = true;

                        if (currentPoint.Y - viewport.Top < offsetY)
                            moveUp = true;

                        if (viewport.Bottom - currentPoint.Y < offsetY)
                            moveDown = true;

                        if (moveLeft || moveRight || moveUp || moveDown)
                        {

                            using (DiagramRenderLock locker = new DiagramRenderLock(_diagram))
                            {
                                if (moveUp)
                                    _diagram.YViewOffset += offsetY;

                                if (moveDown)
                                    _diagram.YViewOffset -= offsetY;

                                if (moveLeft)
                                    _diagram.XViewOffset += offsetX;

                                if (moveRight)
                                    _diagram.XViewOffset -= offsetX;
                            }

                            ProcessMouseMove(currentScreenPoint.ToViewPoint(_diagram.Offset, _diagram.Scale), false);
                        }
                    }));

                Thread.Sleep(100);
            }
        }