2015-09-22 1 views
0

Je développe un DocumentPaginator personnalisé qui permet à un appelant de spécifier son propre contenu d'en-tête, ce qu'il fait en fournissant un UIElement - qui pourrait être un logo d'entreprise (Image), un texte d'en-tête (TextBlock) ou autre.Comment ajouter un UIElement à un ContainerVisual?

Je crée l'en-tête comme celui-ci, où CustomHeaderContent est le contenu d'en-tête fournie par l'appelant: -

var header = new ContainerVisual(); 
header.Transform = new TranslateTransform(_margin.Width, _margin.Height); 
// Add the caller's content (CustomHeaderContent is of type UIElement) 
header.Children.Add(CustomHeaderContent); 

(Ce header ContainerVisual se éventuellement ajouté à un autre ContainerVisual représentant la totalité de la page imprimée).

Pour l'instant, mon appelant crée juste programme un Border et attribue cela à la propriété CustomHeaderContent: -

_docPaginator.CustomHeaderContent = new Border { Background = ... }; 

Cependant quand je lance l'application échoue sur la ligne header.Children.Add(...); à l'exception: -

Visualisation spécifiée est déjà un enfant d'un autre Visual ou la racine d'un CompositionTarget.

Comment puis-je ajouter un UIElement à un ContainerVisual - si c'est possible? Sinon, quelles sont mes alternatives?

+0

S'il vous plaît montrer aussi le code où CustomHeaderContent est créé. – Clemens

+0

@Clemens ce n'est rien de spécial, mais j'ai mis à jour la question. –

+0

CustomHeaderContent est-il utilisé ailleurs, par ex. en XAML? Il semble déjà faire partie d'un arbre visuel. – Clemens

Répondre

0

Je n'arrivais pas à aller vite, alors j'ai maintenant refacturé le code pour utiliser les délégués où l'appelant peut "dessiner" le contenu de l'en-tête et du pied de page. Quelque chose comme ceci: -

public delegate void DrawHeaderDelegate(DrawingContext ctx, Rect bounds); 

public DrawHeaderDelegate DrawCustomHeader { get; set; } 

// Code within the GetPage() method now looks like:- 
    var header = new DrawingVisual(); 
    header.Transform = new TranslateTransform(_margin.Width, _margin.Height); 
    using (var ctx = header.RenderOpen()) 
    { 
     var bounds = new Rect(0, 0, UsablePageWidth, HeaderHeight); 
     DrawCustomHeader(ctx, bounds); // Call the delegate 
    } 

Puis, en l'appelant: -

_docPaginator.DrawCustomHeader = (ctx, bounds) => 
    { 
     ctx.DrawText ... // Or whatever 
    };