public PageRoutedEventArgs(RoutedEvent routedEvent, GraphicVisualPage source)
     : base(routedEvent, source)
 {
     PageScale  = source.PageScale;
     PageSize   = source.PageSize;
     RenderSize = source.RenderSize;
     //PageOffset = new Point(source.PageOffsetX, source.PageOffsetY);
     PageOffset = source.PageOffset;
 }
        //
        // Property Changed Callback
        //
        private static void VisualHostChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            GraphicVisualPage page = d as GraphicVisualPage;

            if (e.OldValue != null)
            {
                page.Children.Remove((Visual)e.OldValue);
            }
            if (e.NewValue != null)
            {
                page.Children.Add((Visual)e.NewValue);
                page.SetVisualHostTranform();
            }
        }
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            GraphicVisualPage page = GetTemplateChild("PART_Page") as GraphicVisualPage;

            _page = page;

            if (page != null)
            {
                page.PageSizeChanged += (sender, e) =>
                {
                    SetScrollBars(e as PageRoutedEventArgs);
                    e.Handled = true;
                };

                page.PageScaleChanged += (sender, e) =>
                {
                    SetScrollBars(e as PageRoutedEventArgs);
                    e.Handled = true;
                };

                page.PageRenderSizeChanged += (sender, e) =>
                {
                    SetScrollBars(e as PageRoutedEventArgs);
                    e.Handled = true;
                };

                page.PageOffsetChanged += (sender, e) =>
                {
                    // 强制刷新
                    OperatorAdorner.InvalidateVisual();
                    e.Handled = true;
                };
            }

            AdornerDecorator addr = GetTemplateChild("PART_AdornerDecorator") as AdornerDecorator;

            if (addr != null)
            {
                _operatorAdorner             = new PageOperatorAdorner(page);
                _operatorAdorner.DataContext = this;
                //_pageAdorner.Canvas.Background = Brushes.LightGreen.Clone();
                //_pageAdorner.Canvas.Background.Opacity = 0.3;
                addr.AdornerLayer.Add(_operatorAdorner);
            }
        }
        //
        // Property Changed Callback
        //
        private static void PageScaleChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            // 页面比例缩放时,同时调整页面偏移量,保证画面中心位置不变
            //
            double            delt    = (double)e.NewValue / (double)e.OldValue;
            GraphicVisualPage page    = d as GraphicVisualPage;
            double            offsetX = page.PageOffset.X * delt + page.ActualWidth / 2.0 * (1.0 - delt);
            double            offsetY = page.PageOffset.Y * delt + page.ActualHeight / 2.0 * (1.0 - delt);

            page.PageOffset = new Point(offsetX, offsetY);

            // 更新网格 Update grid
            page.UpdateGridVisual();

            // 激发 PageScaleChangedEvent 事件
            // Raise PageScaleChangedEvent
            page.RaiseEvent(new PageRoutedEventArgs(PageScaleChangedEvent, page));
        }