2011-09-22 10 views
6

Korzystam z pomyślnej wersji XamlReader do załadowania pliku xaml i utworzenia FrameworkElement do pracy.Wiązania nie są stosowane do dynamicznie ładowanego pliku xaml

XAML jestem ładowanie ma wiążących w nim wyrażeń takich jak:

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

Gdybym to FrameworkElement wrócę z XamlReader.Load() w oknie WPF, wiązanie wszystko działa poprawnie. W tym przypadku używam Laurent Bugnion's excellent article on creating PNGs from WPF/XAML. Ponieważ wynik XamlReader.Load() jest zapisywany bezpośrednio do PNG poprzez VisualBrush, wydaje się, że niezbędne mechanizmy WPF do wywoływania wyrażeń wiążących są ominięte.

To prowadzi mnie do przekonania, że ​​rzeczywiste wiązania nie są wywoływane po prostu przez wywołanie XamlReader.Load(), lub że nie działają z powodu czegoś, o czym nie wiem, że nie jest drzewo wizualne do dodajesz FrameworkElement do istniejącego drzewa wizualnego lub czegoś podobnego.

Czy jest coś, co mogę zrobić, aby wywołać te wiązania?

Wielkie dzięki z góry.

+0

Sądzę, że wymagane jest podanie układu i renderowania, aby widok mógł być zapisywany jako obraz i jest to możliwe tylko wtedy, gdy załadujemy go na wizualne drzewo. Popraw mnie, jeśli się mylę. Chociaż XamlWriter z FlowDocument to trochę inna historia. –

+0

@AngelWPF Udało mi się go rozwiązać i opublikowałem odpowiedź poniżej. Wygląda na to, że zachowuję się tak, jak chcę, więc pod warunkiem, że nie popełniłem jakiegoś naiwnego błędu, zrobię to. Nie mogę ci powiedzieć, jak mi ulżyło, że to działa ... –

Odpowiedz

4

NAPRAWIONO!

Hm, pozwól mi wyjaśnić ...

nie mam pojęcia, jak mam z nim teraz, ale okazało się pomocne brzmiące artykułu na MSDN dotyczące Initialization for Objects Not in an Object Tree.

w nim, że okazało się, że następujący przykład kod:

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

I wyglądała na (również doskonała) przykładu Laurent, że wymienione powyżej w pytaniu i dostosowane do wykorzystania z XamlReader następująco:

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

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

... 

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

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

dodałem BeginInit(), EndInit() i UpdateLayout() (choć przez proces eliminacji wierzę UpdateLayout() jest klucz) i teraz wyrażeń wiążących w moim dynamicall y-loaded xaml działają poprawnie. Hurra!

+0

Nie jest jasne, czego wcześniej nie robiłeś. Jaki jest kluczowy klucz? –

+0

Ahh tak w moim podekscytowaniu zapomniałem wyjaśnić. Zaktualizowałem teraz odpowiedź. :) –

Powiązane problemy