1

WPF でフロー ドキュメントを印刷する良い方法を見つけようとしています。私が望むのは、ドキュメントをデザインするときにドキュメントがどのようになるかを確認できるようにすることです。そのため、純粋な FlowDocument を XAML として作成することは問題外です (Visual Studio ではデザイン ビューが表示されないため)。

だから私が今やったことは、このような FlowDocument を含むウィンドウを作成することです (コードをより簡潔にするために、いくつかの余分な部分が削除されています):

<Window x:Class="MyNamespace.ProjectPrintout...>
  <Grid>
    <FlowDocumentReader>
      <FlowDocument ColumnWidth="500" Name="Document">
        <!-- Header -->
        <Paragraph Name="HeaderText">
          The header will go here
        </Paragraph>
      </FlowDocument>
    </FlowDocumentReader>
  </Grid>
</Window>

この Window をユーザーに表示することは決してないため、これは少し奇妙です。FlowDocument を Window でラップするだけなので、開発中にどのように見えるかを確認できます。このIcanは一緒に暮らすことができます。

したがって、アプリケーションの別の場所で、この FlowDocument をデフォルトのプリンターに出力したいと考えていますが、ヘッダーも動的に設定する必要があります (ここでは省略されている動的データを必要とするドキュメントの他の多くの部分に加えて)。

印刷するコードは次のようになります。

  var printout = new ProjectPrintout();
  printout.HeaderText= new Paragraph(new Run("Proper header text"));
  var document = printout.Document;

  var pd = new PrintDialog();
  IDocumentPaginatorSource dps = document;
  pd.PrintDocument(dps.DocumentPaginator, "Document");

ドキュメントは印刷されており、コードから「適切なヘッダー テキスト」に置き換えたとしても、ヘッダー テキストに「ヘッダーはここに移動します」と表示されていることを除けば問題ないように見えます。また、次のように変更してみました。

(printout.HeaderText.Inlines.FirstInline as Run).Text = "Proper header text";

しかし、結果は同じです。

問題は、印刷する前に FlowDocument の内容をコードから変更するにはどうすればよいですか、または私のアプローチの代わりにこれを行うより良い方法はありますか?

4

1 に答える 1

4

救助のためのMVVM :

エピファニー:UIはデータではありません。UIはデータストアではありません。UIは、データを保存するためではなく、表示するためのものです。

1-データを保持するための単純なオブジェクトを作成します

public class MyDocumentViewModel: INotifyPropertyChanged //Or whatever viewmodel base class
{
    private string _header;
    public string Header 
    {
        get { return _header; }
        set
        {
            _header = value;
            NotifyPropertyChange(() => Header);
         }
     }

     //Whatever other data you need
}

Binding2-ドキュメントでsを定義します。

<Paragraph>
    <Run Text="{Binding Header}"/>
</Paragraph>

3-FlowDocumentDataContextをこのクラスのインスタンスに設定します。

var flowdoc = new YourFlowDocument();
var data = new MyDocumentViewModel { Header = "this is the Header" };
//whatever other data

flowdoc.DataContext = data;

//do the printing stuff.
于 2012-12-07T19:48:16.427 に答える