2011-09-22 11 views
6

Sto utilizzando XamlReader correttamente per caricare un file xaml e creare un FrameworkElement con cui lavorare.Associazioni non applicate a xaml caricato dinamicamente

XAML Sono carico ha espressioni vincolanti in esso come ad esempio:

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

Se metto il FrameworkElement torno da XamlReader.Load() in una finestra WPF, il legame tutto funziona benissimo.

Tuttavia, in questo caso sto usando Laurent Bugnion's excellent article on creating PNGs from WPF/XAML. Poiché il risultato di XamlReader.Load() viene scritto direttamente su un PNG tramite un VisualBrush, sembra che i meccanismi necessari di WPF per richiamare le espressioni di collegamento siano ignorati.

Questo mi porta a credere che i binding attuali non vengano effettivamente richiamati solo chiamando lo XamlReader.Load(), o che non stiano funzionando a causa di qualcosa che non so di fare con il fatto di non essere un albero visivo fino aggiungi lo FrameworkElement a un albero visivo esistente o qualcosa del genere.

C'è qualcosa che posso fare per garantire che questi collegamenti vengano richiamati?

Molte grazie in anticipo.

+0

Penso che sia necessario un layout e il rendering pass per una vista da poter scrivere come un'immagine e ciò è possibile solo se lo cariciamo su un albero visivo. Correggimi se sbaglio Sebbene XamlWriter con FlowDocument sia una storia leggermente diversa. –

+0

@AngelWPF Sono riuscito a risolverlo e ho postato una risposta qui sotto. Sembra che si stia comportando come voglio, quindi a patto che non ci sia un errore ingenuo che ho fatto, ho intenzione di andare con esso. Non posso dirvi quanto sono sollevato per farlo funzionare ... –

risposta

4

L'ho fissato !!

Ahem, mi permetta di spiegare ...

Non ho idea di come ho avuto modo di ora, ma ho trovato un articolo utile che suona su MSDN per quanto riguarda Initialization for Objects Not in an Object Tree.

In essa ho trovato il seguente esempio di codice:

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

Ho guardato il (di nuovo, eccellente) esempio da Laurent che ho menzionato nella domanda precedente, e personalizzata l'uso di XamlReader come segue:

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

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

... 

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

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

ho aggiunto il BeginInit(), EndInit() e UpdateLayout() (anche se dal processo di eliminazione credo UpdateLayout() è la chiave) e ora le espressioni vincolanti nel mio dynamicall xaml caricato y funziona correttamente. Evviva!

+0

Non è chiaro cosa non stavate facendo prima. Qual è il bit chiave? –

+0

Ahh sì nella mia eccitazione ho dimenticato di chiarire. Ho aggiornato la risposta ora. :) –

Problemi correlati