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的背景会扩展到装饰元素的底部。
出了什么问题?
答案 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);
}