1

XAML コントロールを XPS ドキュメントに変換しようとしていますが、これをバッチ モードで実行したいと考えています。コントロールをメモリにレンダリングし、画面にレンダリングせずに XPS に出力します。このプロジェクトは、GUI がなくても動作するはずです。

stackoverflow の関連トピックを読みましたが、正しく動作しません。コントロールを作成して DataContext を設定できますが、出力 xps は空です。画面にコントロールをレンダリングしてから印刷すると、すべて問題ありませんが、これをバッチ モードで実行したい場合は、空のドキュメントを取得しました (静的なラベルなどしかありませんでした)。

コントロールにコントロールをデータにバインドさせるにはどうすればよいですか?

次の難しい部分は次のとおりです。長い複数ページのコントロールを印刷する場合、各ページにカスタム ヘッダーを追加するにはどうすればよいですか? (例:リスト?)

4

1 に答える 1

1

2 番目の質問は、スタンドアロンであるほど複雑であるため、スキップします。

私は同じ問題に直面しましたが、いくつかの異なることが原因である可能性があります。

問題がバインディングがまだ「トリップ」されていないことが原因である場合、解決策は少しハックですが、DataContext 型を制御すれば簡単に実行できます。型にパブリック メソッドまたは内部メソッドを追加するだけで、各パブリック プロパティの PropertyChanged イベントを発生させることができます。次に例を示します。

public interface IForceBinding : INotifyPropertyChanged
{
  void ForceBindings();
}

public class MyDataContext : IForceBinding
{
  public event PropertyChanged;
  private string _text;
  public string Text
  {
    get{return _text;}
    set{_text = value; OnPropertyChanged("Text");}
  }
  public void ForceBindings()
  {
    OnPropertyChanged("Text");
  }

  private void OnPropertyChanged(string propertyName)
  { 
    // you know the drill
  }
}

次に、次のように使用できます。

public void Print(MyDataContext preconfiguredContext){
  var page = new MyWpfPage();
  page.DataContext = preconfiguredContext;
  preconfiguredContext.ForceBindings();
  // write to xps

これが機能しない場合、最初のページのバインディングが表示されないというバグが発生している可能性があります。その解決策を再発見するには、しばらく掘り下げる必要があります。

于 2010-09-27T19:41:07.437 に答える