2010-09-27 41 views
1

我試圖將XAML控件轉換爲XPS文檔,但我想在批處理模式下執行此操作 - 在內存中呈現控件並將其打印到XPS而不呈現它屏幕。即使沒有GUI,這個項目也可以工作。通過Wpf控件打印文件並將其轉換爲XPS

我讀過Related topic on stackoverflow,但它工作不正常。我可以創建控件,設置DataContext,但輸出xps爲空。如果我在屏幕上呈現控件,然後打印出來,一切正常,但是如果我想做到這一點在批處理模式下,我得到空文檔(當時只有靜電標籤等)

如何強制控制綁定控件與數據?

下一個難題將是:如何在每頁上添加我的自定義頁眉,如果我打印長多頁控件? (例如列表?)

+0

我建議大力解決第二個問題,因爲這是一個非常複雜的問題。 – Will 2010-09-27 19:25:21

+0

順便說一句,第二個問題是我見過的唯一一個接近解決這個問題的東西,這篇文章從07年開始討論。您可以嘗試詢問自那時以來是否有任何更新。 http://blogs.msdn.com/b/fyuan/archive/2007/03/10/convert-xaml-flow-document-to-xps-with-style-multiple-page-page-size-header-margin。 aspx – Will 2010-09-27 19:43:18

回答

1

我跳過了第二個問題,因爲它足夠複雜,可以獨立使用。

我面臨同樣的問題,但它可能是由幾個不同的事情引起的。

如果問題是因爲綁定還沒有「跳閘」,那麼解決方案有點冒險,但是如果控制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 

如果不工作,你可能會遇到一個bug,其中第一頁上的綁定從未露面。在我能夠重新找到解決方案之前,我必須挖掘一段時間。

+0

我試過通過NotifyChange更新綁定,但它不工作:(還是這個問題,我看起來像WPF不想呈現這個控件,因爲它沒有顯示任何地方... – Simon 2010-09-28 06:27:00

+0

@simon嘗試添加兩個你可以看到第二個頁面? – Will 2010-09-28 12:43:25

+0

@simon我問,因爲根據你是怎麼做的,第一頁在xps文檔中有時可能不是「可見」的,如果是這樣的話,這個案例... – Will 2010-09-28 18:51:16

相關問題