我正在开发一个自定义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 - 如果可能的话?如果没有,我的替代方案是什么?
答案 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
};