0

ユーザーが表示している FlowDocument を印刷しようとしています。(PrintDialog からの) 変更が DocumentViewer に反映されないように、元のドキュメントのコピーを作成するルーチンを作成しました。

残念ながら、私のコピーはそのフィールドにバインドされたすべての情報を失ったようです。DataContext をリセットしようとしましたが、コピーの IsLoaded プロパティがまだ false に戻っているため、バインドが行われていないと思われます。

何か案は?

ドキュメントをコピーするために使用しているコードは次のとおりです。

private static void AddDocument(FlowDocument from, FlowDocument to)
{
    TextRange tr = new TextRange(from.ContentStart, from.ContentEnd);

    using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
    {
        TextRange tr2 = null;

        System.Windows.Markup.XamlWriter.Save(tr, ms);
        tr.Save(ms, DataFormats.XamlPackage, true);
        tr2 = new TextRange(to.ContentEnd, to.ContentEnd);
        tr2.Load(ms, DataFormats.XamlPackage);
    }
}

ドキュメントを印刷するために使用しているコードは次のとおりです。

public static void PrintFlowDocument(FlowDocument fd, string title)
{
    PrintDialog pd = new PrintDialog();
    IDocumentPaginatorSource idps = null;
    FlowDocument flowDoc = new FlowDocument();

    AddDocument(fd, flowDoc);

    flowDoc.DataContext = fd.DataContext;
    flowDoc.PageHeight = pd.PrintableAreaHeight;
    flowDoc.PageWidth = pd.PrintableAreaWidth;
    flowDoc.PagePadding = new Thickness(50);
    flowDoc.ColumnGap = 0;
    flowDoc.ColumnWidth = pd.PrintableAreaWidth;


    idps = flowDoc;

    if (pd.ShowDialog() == true)
    {
        pd.PrintDocument(idps.DocumentPaginator, title);
    }
}

前もってありがとう、
ソニー

4

2 に答える 2

0

同様の問題があり、ドキュメントの作成をバックグラウンド スレッドに強制すると、バインディングが発生する可能性があることがわかりました。そうしないと、UI スレッドで発生しません。

したがって、ドキュメントのコピー メソッドが関数である場合、次のようになります。

            Dim flowDoc As FlowDocument = 
                DirectCast(<ViewInstance>.UIDispatcher.Invoke(Function() 
                               AddFlowDocument(fd),
                               Windows.Threading.DispatcherPriority.Background), 
                           FlowDocument)
于 2012-06-15T12:38:57.210 に答える
0

この行の一部がおかしいことに気付きましたか?

tr2 = new TextRange(to.ContentEnd, to.ContentEnd);
于 2012-06-14T17:48:12.920 に答える