2011-09-22 43 views
6

我使用XamlReader成功加載xaml文件並創建要使用的FrameworkElement綁定不適用於動態加載的xaml

XAML中我加載在其綁定表達式,如:

<TextBlock Text="{Binding DataContextTextProperty}" /> 

如果我放在FrameworkElement的我從XamlReader.Load()回到一個WPF窗口,結合一切工作正常。

但是,在這種情況下,我正在使用Laurent Bugnion's excellent article on creating PNGs from WPF/XAML。由於XamlReader.Load()的結果是通過VisualBrush直接寫入PNG,所以似乎繞過了WPF調用綁定表達式的必要機制。

這使我相信實際的綁定並不是真的只是通過調用XamlReader.Load()來調用,或者他們沒有工作,因爲我不知道要做什麼,直到沒有視覺樹您將FrameworkElement添加到現有的可視化樹或其他東西。

有什麼我可以做,以確保這些綁定被調用?

非常感謝提前。

+0

我認爲一個視圖需要一個佈局和渲染通道才能作爲圖像寫入,並且只有在將其加載到可視化樹上時纔有可能。糾正我,如果我錯了。雖然帶有FlowDocument的XamlWriter是一個有點不同的故事。 –

+0

@AngelWPF我設法解決它,並在下面發佈了答案。它看起來像我想要的那樣行事,所以提供這個並不是我曾經犯過的一個天真的錯誤,我會去處理它。我無法告訴你,我是如何得到這個工作的緩解...... –

回答

4

I FIXED IT !!

咳咳,允許我解釋...

我不知道我是如何走到現在,但我發現關於Initialization for Objects Not in an Object Tree MSDN上一個有用的冠冕堂皇的文章。

在它我發現下面的代碼例如:

Button b = new Button(); 
b.BeginInit(); 
b.Background = Brushes.Blue; 
b.Width = b.Height = 200; 
b.EndInit(); 
b.Measure(paperSize); 
b.Arrange(new Rect(paperSize)); 
b.UpdateLayout(); 

我看着(再次,優)例如從勞倫我在問題中提到的上方,並且定製的XamlReader使用如下:

var element = (FrameworkElement)XamlReader.Load(xamlInput); 

element.BeginInit(); 
element.DataContext = dataContext; 

... 

element.Measure(renderingSize); 
element.Arrange(renderingRectangle); 

element.EndInit(); 
element.UpdateLayout(); 

我加了BeginInit()EndInit()UpdateLayout()(雖然通過排除法,我相信UpdateLayout()是關鍵)在我dynamicall現在綁定表達式y-loaded xaml工作正常。歡呼!

+0

目前還不清楚你以前沒有做過什麼。關鍵是什麼? –

+0

啊,在我興奮的時候,我忘了說清楚。我已經更新了答案。 :) –