2011-09-22 14 views
6

Estoy usando XamlReader con éxito para cargar un archivo xaml y crear un FrameworkElement para trabajar.Enlaces no aplicados a xaml dinámicamente cargados

El xaml estoy de carga tiene expresiones de enlace en ella, tales como:

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

Si coloco el FrameworkElement vuelva de XamlReader.Load() en una ventana de WPF, la unión todo trabaja muy bien. Sin embargo, en este caso estoy usando Laurent Bugnion's excellent article on creating PNGs from WPF/XAML. Dado que el resultado de XamlReader.Load() se escribe directamente en un archivo PNG a través de VisualBrush, parece que se omiten las mecánicas necesarias de WPF para invocar expresiones de enlace.

Esto me lleva a creer que las encuadernaciones reales no se están invocando simplemente llamando al XamlReader.Load(), o que no están funcionando debido a algo que no sé hacer porque no hay un árbol visual hasta agrega el FrameworkElement a un árbol visual existente o algo así.

¿Hay algo que pueda hacer para asegurar que se invoquen estos enlaces?

Muchas gracias de antemano.

+0

Creo que se necesita un diseño y un pase de representación para que una Vista se pueda grabar como una imagen y solo es posible si la cargamos en un árbol visual. Corrígeme si estoy equivocado. Aunque XamlWriter con FlowDocument es una historia un poco diferente. –

+0

@AngelWPF Pude resolverlo y he publicado una respuesta a continuación. Parece que se está comportando como yo quiero, por lo que siempre que no haya algún error ingenuo que haya cometido, voy a aceptarlo. No puedo decirte lo aliviado que estoy de que esto funcione ... –

Respuesta

4

¡¡LO ARREGLO !!

Ejem, me permite explicar ...

no tengo idea de cómo llegué a ella ahora, pero me encontré con un artículo que suenan muy útil en MSDN respecto Initialization for Objects Not in an Object Tree.

En él conocer el ejemplo de código siguiente:

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(); 

Miré el (de nuevo, excelente) ejemplo de Laurent que he mencionado en la pregunta anterior, y personalizar el uso de XamlReader como sigue:

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

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

... 

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

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

que añade el BeginInit(), EndInit() y UpdateLayout() (aunque por proceso de eliminación creo UpdateLayout() es la clave) y ahora las expresiones de enlace en mi Dynamicall xaml cargado y están funcionando correctamente. ¡Hurra!

+0

No está claro lo que no estabas haciendo antes. ¿Cuál es la parte clave? –

+0

Ahh sí en mi emoción, me olvidé de dejarlo en claro. He actualizado la respuesta ahora. :) –

Cuestiones relacionadas