protected abstract void OnRenderCore(DrawingContext dc, RenderState state);
        protected sealed override void OnRender(DrawingContext drawingContext)
        {
            if (Viewport == null)
            {
                return;
            }

            Rect output = Viewport.Output;

            if (output.Width == 0 || output.Height == 0)
            {
                return;
            }
            if (output.IsEmpty)
            {
                return;
            }
            if (Visibility != Visibility.Visible)
            {
                return;
            }

            if (shouldReRender || manualTranslate || renderTarget == RenderTo.Image || beforeFirstUpdate || updateCalled)
            {
                if (graphContents == null)
                {
                    graphContents = new DrawingGroup();
                }
                if (beforeFirstUpdate)
                {
                    Update();
                }

                using (DrawingContext context = graphContents.Open())
                {
                    if (renderTarget == RenderTo.Screen)
                    {
                        RenderState state = CreateRenderState(Viewport.Visible, RenderTo.Screen);
                        OnRenderCore(context, state);
                    }
                    else
                    {
                        // for future use
                    }
                }
                updateCalled = false;
            }

            // thumbnail is not created, if
            // 1) CreateThumbnail is false
            // 2) this graph has IsLayer property, set to false
            if (ShouldCreateThumbnail)
            {
                RenderThumbnail();
            }

            if (!manualClip)
            {
                drawingContext.PushClip(new RectangleGeometry(output));
            }
            bool translate = !manualTranslate && IsTranslated;

            if (translate)
            {
                drawingContext.PushTransform(new TranslateTransform(offset.X, offset.Y));
            }

            drawingContext.DrawDrawing(graphContents);

            if (translate)
            {
                drawingContext.Pop();
            }
            if (!manualClip)
            {
                drawingContext.Pop();
            }
            shouldReRender = true;
        }