打印使用OnLoaded进行渲染的UserControl

时间:2010-12-29 09:01:01

标签: wpf xaml xps xpsdocument

我正在尝试打印我在代码中创建的WPF UserControl。我在帖子结尾处使用DocumentPaginator实现这样做。

我遇到的问题是DocumentPage类没有在我的UserControl上调用Loaded,因此控件没有完全呈现。我无法将OnLoaded中的代码移动到更好的位置,因为我不是控件的维护者。

在控件上触发Loaded事件的正确方法是什么?我意识到只有当控件附加到PresentationSource时才会触发该事件,但我试图发送打印作业而不显示屏幕上的内容。我可能会在某处使用Visibility = Hidden来渲染控件,但这感觉很便宜而且很糟糕。

class MyPaginator : DocumentPaginator
{
    public MyPaginator()
    {
        PageSize = new Size(800, 600);
    }

    public override DocumentPage GetPage(int pageNumber)
    {
        var uc = new ChartUC();

        uc.Measure(PageSize);
        uc.Arrange(new Rect(PageSize));
        uc.UpdateLayout();

        return new DocumentPage(uc, PageSize, new Rect(PageSize), new Rect(PageSize));
    }

    public override bool IsPageCountValid
    {
        get { return true; }
    }

    public override int PageCount
    {
        get { return 1; }
    }

    public override System.Windows.Size PageSize
    {
        get;
        set;
    }

    public override IDocumentPaginatorSource Source
    {
        get { return null; }
    }
}

1 个答案:

答案 0 :(得分:-1)

你总是可以作弊并使用反射来调用方法。

var instance = new MyUserControl() as UserControl;
var method = instance.GetType().GetMethod("OnLoadedOrWhateverTheMethodNameIs",
                                          BindingFlags.Instance | 
                                          BindingFlags.NonPublic);
if(method != null)
  method.Invoke(instance, new object[] { instance, EventArgs.Empty });