public void ScrollToVisual(DrawingVisual drawingVisual)
        {
            Rect visualBound = drawingVisual.ContentBounds;
            TranslateTransform translateTransform = drawingVisual.Transform as TranslateTransform;

            if (translateTransform != null)
                visualBound.Offset(new Vector(translateTransform.X, translateTransform.Y));

            double offsetX;
            double offsetY;
            double scale;
            //GetScrollOffset(visualBound, out offsetX, out offsetY, Key.None);
            GetScaleScrollOffset(visualBound, out scale, out offsetX, out offsetY);

            ZoomAndPanAnimationHelper animationHelper = new ZoomAndPanAnimationHelper(
                                                offsetX, offsetY, scale, this, this.graphControl, true);
            //double offsetX;
            //double offsetY;
            //GetScrollOffset(visualBound, out offsetX, out offsetY, Key.None);

            //ZoomAndPanAnimationHelper animationHelper = new ZoomAndPanAnimationHelper(
            //                                    offsetX, offsetY, this, this.graphControl);
        }
        internal void HandleKeyDown(object sender, KeyEventArgs e)
        {
            //Self-TODO(Joy):this function need to be revised
            if (radialMenu != null)
            {
                if (subRadialMenu != null)
                    subRadialMenu.UpdateKeyword(e);
                else
                    radialMenu.UpdateKeyword(e);
                graphCanvas.graphCanvas.Focus();
                e.Handled = true;
                return;
            }

            ModifierKeys modifier = Keyboard.Modifiers;
            Key k = e.Key;

            if (modifier.HasFlag(ModifierKeys.Control) && e.Key == Key.A)
            {
                foreach (uint nodeId in nodeVisuals.Values)
                    graphController.DoSelectComponent(nodeId, ModifierKeys.None);
                ZoomToFit();
                return;
            }
            if (modifier.HasFlag(ModifierKeys.Shift))
                return;
            if (e.Key == Key.Delete || e.Key == Key.Enter || e.Key == Key.Back)
                return;

            //scroll to left/right/top/bottom of the working space
            if (e.Key == Key.Home
                || e.Key == Key.End
                || e.Key == Key.Prior || e.Key == Key.PageUp
                || e.Key == Key.Next || e.Key == Key.PageDown)
            {
                Rect workingRegion = GetNodeRegion();
                if (workingRegion == Rect.Empty)
                    return;

                double offsetX, offsetY;
                GetScrollOffset(workingRegion, out offsetX, out offsetY, e.Key);

                ZoomAndPanAnimationHelper animationHelper = new ZoomAndPanAnimationHelper(
                                                offsetX, offsetY, this, this.graphControl);

                e.Handled = true;
                return;
            }
        }
        private void ZoomToFit()
        {
            if (panning)
                EndPan();

            ScrollViewer scrollViewer = graphControl.canvasScrollViewer;
            Grid grid = graphControl.canvasGrid;
            ScaleTransform scaleTransform = graphControl.scaleTransform;

            Rect frame = this.GetSelectedRegion();

            //scale
            double zoomInRatioX = scrollViewer.ActualWidth / frame.Width;
            double zoomInRatioY = scrollViewer.ActualHeight / frame.Height;
            if ((zoomInRatioX == 0) || (zoomInRatioY == 0))
                return;

            double newScale = Math.Min(zoomInRatioX, zoomInRatioY);
            newScale = ConvertScale(newScale);

            //Scroll Viewer Offset
            zoomPanPivotPoint = new Point(frame.Left + frame.Width / 2, frame.Top + frame.Height / 2);
            Point centerPosition = new Point(scrollViewer.ViewportWidth / 2, scrollViewer.ViewportHeight / 2);

            double offsetX = zoomPanPivotPoint.X * newScale - centerPosition.X;
            double offsetY = zoomPanPivotPoint.Y * newScale - centerPosition.Y;

            //AnimationHelper(offsetX, newScale, Configurations.ShortAnimationTime);

            ZoomAndPanAnimationHelper animationHelper = new ZoomAndPanAnimationHelper(offsetX, offsetY, newScale, this, this.graphControl, false);
        }