如何在ScrollViewer中将Adorner与其装饰元素进行一对一匹配?

时间:2017-04-26 16:55:05

标签: wpf scrollviewer adorner

WPF

我在ScrollViewer的Grid中有一个控件A(一个inkcanvas)。控制器A比物理窗口高,因此ScrollViewer正确添加垂直滚动条,可以通过向下滚动查看整个控件。当使用控件B(另一个墨水扫描)连接Adorner时,为了控制A,向下滚动显示要在屏幕底部切断的Adorner。也就是说,Adorner并未完全覆盖装饰元素和/或在滚动时不会向下延伸。

如何让Adorner(控件)完全覆盖装饰元素并尊重ScrollViewer。 (我需要在Adorner控件的像素和ScrollViewer中的装饰元素之间进行一对一匹配。)

TIA

编辑#1:设置InkCanvas背景的Adorner中的关键行是

  

_inkcanvas.Background = CreateGrid();

public InkCanvasTextAdorner(InkCanvas element) 
            : base(element)
        {
            _element = element;

            _visuals = new VisualCollection(this);
            _inkcanvas = new InkCanvas();

            _inkcanvas.Background = CreateGrid();

            _visuals.Add(_inkcanvas);   

            AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(element);
            adornerLayer.Add(this);
        }

如果使用InkCanvas(如上所述),则会在底部剪裁Adorner的背景。然而,装饰控件确实继续在装饰元素的底部。

但是,如果使用Canvas而不是InkCanvas,则Adorner的背景会扩展到装饰元素的底部。

出了什么问题?

1 个答案:

答案 0 :(得分:0)

我猜测,使用Canvas而不是InkCanvas扩展经过物理屏幕的Background属性的差异可能是因为Canvas继承自Panel而InkCanvas没有。基于Canvas背景确实做我需要的发现,我发现下面的代码确实完成了我想要的东西 - 画布允许看到它下面的图层的图像然后发布InkCanvas将接受笔画的线条网格。一切都很好:))

public InkCanvasTextAdorner(InkCanvas element) 
            : base(element)
        {
            _element = element;

            // The VisualCollection has only one visual parent.  I.e. InkCanvasTextAdorner is the parent to the VisualCollection.
            // By overriding default rendering behavior of the VisualCollection, any kind of control and its children can be placed in the Adorner. 
            _visuals = new VisualCollection(this);
            _inkcanvas = new InkCanvas();
            _inkcanvas.Background = Brushes.Transparent;

            _canvas = new Canvas();
            _canvas.Background = CreateGrid();

            _grid = new Grid();
            _grid.Children.Add(_canvas);
            _grid.Children.Add(_inkcanvas);

            // The _grid is a logical child of the VisualCollection of the Adorner. The ArrangeOverride and MeasureOverride will set up the Grid control.
            _visuals.Add(_grid);   // Adding a single control for display.

            // AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(element);
            AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(element);
            adornerLayer.Add(this);
        }

看起来像: enter image description here