2017-04-26 6 views
0

wpfComment obtenir un match one-to-one d'un Adorner avec son élément décoré dans un ScrollViewer?

J'ai un contrôle A, (un inkcanvas), dans une grille dans un ScrollViewer. Conrol A est plus grand que la fenêtre physique, de sorte que ScrollViewer ajoute correctement une barre de défilement verticale et l'ensemble du contrôle peut être consulté en faisant défiler vers le bas. Lorsque vous fixez un Adorner avec un contrôle B, (un autre inkcanvas), pour contrôler A, le défilement vers le bas montre l'Adorner à couper au bas de l'écran. C'est-à-dire que l'Adorner ne recouvre pas complètement l'élément orné et/ou n'est pas étendu vers le bas lors du défilement.

Comment puis-je obtenir l'Adorner (le contrôle) pour couvrir complètement l'élément décoré et respecter le ScrollViewer. (J'ai besoin d'une correspondance un-à-un entre les pixels du contrôle Adorner et l'élément décoré dans le ScrollViewer).

TIA

Edition n ° 1: La ligne clé dans la Adorner qui définit le fond de la InkCanvas est

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

Si un InkCanvas est utilisé (comme ci-dessus) fond du Adorner est clipsé au fond. Le contrôle adorner, cependant, continue au bas de l'élément orné.

Toutefois, si un canevas est utilisé à la place de l'InkCanvas, l'arrière-plan de l'Adorner s'étend au bas de l'élément orné.

Qu'est-ce qui ne va pas?

Répondre

0

Je suppose que la différence dans la propriété Background qui s'étend au-delà de l'écran physique avec le canevas et non InkCanvas peut être due au fait que Canvas hérite de Panel contrairement à InkCanvas. Basé sur la conclusion que l'arrière-plan de Canvas fait ce dont j'ai besoin, je trouve que le code ci-dessous accomplit ce que je veux - le canevas permet de voir des images de couches en dessous et affiche une grille de lignes sur lesquelles InkCanvas accepte les traits. Tout va bien :)

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

qui ressemble à: enter image description here