2017-04-26 73 views
0

wpf如何在ScrollViewer中將裝飾元素與裝飾元素進行一對一匹配?

我有一個控件A,(一個inkcanvas),在ScrollViewer中的一個Grid內。 Conrol A高於物理窗口,因此ScrollViewer可以正確添加垂直滾動條,並且可以通過向下滾動來查看整個控件。當用控制器B(另一個噴墨器)連接裝飾器時,爲了控制A,向下滾動顯示裝飾器在屏幕底部被切斷。也就是說,裝飾者並不完全覆蓋裝飾元素,並且/或者在滾動時不向下延伸。

如何讓裝飾者(控件)完全覆蓋裝飾元素並尊重ScrollViewer。 (我需要在Adorner控件的像素和ScrollViewer中的裝飾元素之間進行一對一的匹配)。

TIA

編輯#1:在裝飾器的關鍵線,用於設置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被使用(如上述)的裝飾器的背景在底部被限幅。然而,裝飾者控件會繼續到裝飾元素的底部。

但是,如果使用Canvas而不是InkCanvas,則Adorner的背景確實會擴展到裝飾元素的底部。

怎麼了?

回答

0

我猜測背景屬性擴展到物理屏幕與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