Wpf 如何在ScrollViewer中获得装饰器与其装饰元素的一对一匹配?

Wpf 如何在ScrollViewer中获得装饰器与其装饰元素的一对一匹配?,wpf,scrollviewer,adorner,Wpf,Scrollviewer,Adorner,wpf 我在ScrollViewer的网格中有一个控件a(inkcanvas)。Conrol A比物理窗口高,因此ScrollViewer正确地添加了一个垂直滚动条,可以通过向下滚动查看整个控件。当使用控件B(另一个inkcanvas)连接装饰条以控制a时,向下滚动显示装饰条将在屏幕底部被切断。也就是说,装饰条没有完全覆盖装饰元素和/或在滚动时没有向下延伸 如何让装饰器(控件)完全覆盖装饰元素并尊重ScrollViewer。(我需要在装饰控件的像素和ScrollViewer中的装饰元素之间进行一

wpf

我在ScrollViewer的网格中有一个控件a(inkcanvas)。Conrol A比物理窗口高,因此ScrollViewer正确地添加了一个垂直滚动条,可以通过向下滚动查看整个控件。当使用控件B(另一个inkcanvas)连接装饰条以控制a时,向下滚动显示装饰条将在屏幕底部被切断。也就是说,装饰条没有完全覆盖装饰元素和/或在滚动时没有向下延伸

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

短暂性脑缺血发作

编辑#1:装饰器中设置InkCanvas背景的关键行为

_inkcanvas.Background=CreateGrid()

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

但是,如果使用画布而不是InkCanvas,则装饰器的背景会延伸到装饰元素的底部


出什么问题了?

我猜背景属性的差异通过物理屏幕扩展到画布而不是InkCanvas,这可能是因为画布从面板继承,而InkCanvas没有。基于画布背景确实满足了我的需要的发现,我发现下面的代码确实满足了我的要求——画布允许看到其下各层的图像,但在其上放置了一个网格线,InkCanvas将接受笔划。一切都好:)

这看起来像:

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);
        }
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);
        }