Печать UserControl, который использует OnLoaded для рендеринга - PullRequest
3 голосов
/ 29 декабря 2010

Я пытаюсь напечатать пользовательский элемент управления WPF, который я создаю в коде.Я делаю это с реализацией DocumentPaginator в конце поста.

Проблема, с которой я столкнулся, заключается в том, что класс DocumentPage не вызывает Loaded в моем UserControl, поэтому элемент управления не полностью отображается.Я не могу переместить код в 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 голосов
/ 18 марта 2011

Вы всегда можете обмануть и использовать отражение для вызова метода.

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