2014-02-28 69 views
2

我已經建立了它可以創建XAML XPS文檔模板化的打印系統,通過WPF的CreateVisualsCollator()手動加載框架元素

FrameworkElement fe = ...; 

using (Package p = Package.Open(...)) 
using (XpsDocument doc = new XpsDocument(p)) 
{ 
    XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc); 
    SerializerWriterCollator col = writer.CreateVisualsCollator(); 

    Size size = new Size(page size...) 
    fe.Measure(size); 
    fe.Arrange(new Rect(size)); 
    fe.UpdateLayout(); 

    col.Write(fe); 
    // fe.IsLoaded is still false here! 
} 

我這樣做沒有一個UI禮物 - 這其實是註定對於Windows服務。

我一直在做黑客手動調用UpdateLayout()執行大小,並意識到我必須這樣做的原因是,控件永遠不會觸發它們的事件,並且永遠不會進入加載狀態。我剛剛遇到了麻煩,因爲這已成爲一個問題,我的破解不再有效。

有沒有辦法手動觸發一個元素及其所有子元素的正確加載?

+0

未加載在initializecomponent方法中調用的事件? – Clueless

+0

沒有。它在渲染之前被調用一段時間。 –

回答

0

我已經能夠從兩個角度對此進行攻擊。

首先,不要直接加載你的元素。使用ContentControl中,這似乎對模板實例更好地處理和解決一些深層數據的綁定問題:

new ContentControl 
{ 
    Content = item, 
    ContentTemplate = template 
} 

接下來,讓閒置的隊列處理。這會強制執行各種延遲的任務,以便WPF在您的窗口閒置時通常排隊等待:

FrameworkElement element = ...; 
element.Dispatcher.BeginInvoke(() => {}, DispatcherPriority.SystemIdle);