如何将UIElement添加到ContainerVisual?

时间:2015-09-22 11:18:50

标签: wpf

我正在开发一个自定义DocumentPaginator,允许调用者指定自己的标题内容,它通过提供UIElement来实现 - 它可以是公司徽标(图像),标题文本(TextBlock),或者随你。

我正在创建这样的标题,其中CustomHeaderContent是调用者提供的标题内容: -

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

(此header ContainerVisual最终会被添加到另一个表示整个打印页面的ContainerVisual中。

现在,我的调用者只是以编程方式创建Border并将其分配给CustomHeaderContent属性: -

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

然而,当我运行应用程序时,它在header.Children.Add(...);行上失败,但有例外: -

  

指定的Visual已经是另一个Visual的子项或CompositionTarget的根。

如何向ContainerVisual添加UIElement - 如果可能的话?如果没有,我的替代方案是什么?

1 个答案:

答案 0 :(得分:0)

我无处可去,所以我现在重构代码以使用代理,其中调用者可以“绘制”页眉和页脚内容。这样的事情: -

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
    }

然后在来电者中: -

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