2017-04-26 3 views
0

wpfAdornerとScrollViewer内の飾られた要素との1対1の一致を取得するにはどうすればよいですか?

私はScrollViewer内のグリッド内にコントロールA(inkcanvas)を持っています。 Conrol Aは物理ウィンドウよりも背が高いので、ScrollViewerは垂直スクロールバーを正しく追加し、スクロールダウンすることでコントロール全体を表示することができます。コントロールB(別のインクキャンバス)を持つAdornerをコントロールする場合、Aを制御するために、下方向にスクロールするとAdornerが画面の下部に表示されます。すなわち、Adornerは、装飾された要素を完全に覆っていない、および/またはスクロール中に下方に拡張されていない。

Adorner(コントロール)は、飾られた要素を完全に覆い、ScrollViewerを尊重する方法を教えてください。 (私は、AdornerコントロールのピクセルとScrollViewer内の装飾された要素との間に1対1のマッチングが必要です)。

TIAは

編集#1:InkCanvasの背景を設定Adornerにキー行が

_inkcanvas.Background = CreateGrid()です。 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); 
     } 

Adornerの背景は、底部にクリップされます。しかし、アドナーコントロールは、装飾された要素の最後まで続きます。

ただし、InkCanvasの代わりにCanvasを使用した場合、Adornerの背景は、装飾された要素の下部まで拡張されます。

どういうところが間違っていますか?

答えて

0

私は、キャンバスがパネルから継承し、InkCanvasがパネルを継承しないので、物理的なスクリーンを超えてキャンバスで拡大するBackgroundプロパティの違いがあると考えています。キャンバスの背景が私が必要とすることをしていることに基づいて、以下のコードは私が望むものを達成することができます。キャンバスはその下のレイヤーからの画像を見ることができ、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

関連する問題