首页 文章

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

提问于
浏览
0

WPF

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

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

TIA

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

_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

    我猜测Background属性与Canvas而不是InkCanvas扩展到物理屏幕的区别可能是因为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

相关问题