2011-09-22 31 views
6

Tôi đang sử dụng thành công XamlReader để tải tệp xaml và tạo FrameworkElement để làm việc.Các ràng buộc không áp dụng cho xaml động

Các XAML Tôi tải có biểu thức ràng buộc ở trong đó như:

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

Nếu tôi đặt FrameworkElement tôi nhận lại từ XamlReader.Load() vào một cửa sổ WPF, các ràng buộc tất cả hoạt động tốt.

Tuy nhiên, trong trường hợp này tôi đang sử dụng Laurent Bugnion's excellent article on creating PNGs from WPF/XAML. Vì kết quả của XamlReader.Load() được ghi trực tiếp vào PNG qua VisualBrush, có vẻ như các cơ chế cần thiết của WPF để gọi các biểu thức ràng buộc bị bỏ qua.

Điều này khiến tôi tin rằng các liên kết thực sự không thực sự được gọi chỉ bằng cách gọi XamlReader.Load() hoặc chúng không hoạt động vì điều gì đó mà tôi không biết làm với không phải là cây thị giác cho đến bạn thêm FrameworkElement vào cây hình ảnh hiện tại hoặc một cái gì đó.

Có điều gì tôi có thể làm để đảm bảo các ràng buộc này được gọi không?

Rất cám ơn trước.

+0

Tôi nghĩ rằng bố cục và hiển thị biểu tượng là bắt buộc để Chế độ xem có thể ghi được dưới dạng hình ảnh và có thể chỉ khi chúng tôi tải nó lên cây hình ảnh. Đúng nếu tôi đã sai lầm. Mặc dù XamlWriter với FlowDocument là một câu chuyện khác. –

+0

@AngelWPF Tôi đã cố gắng giải quyết và đã đăng câu trả lời bên dưới. Dường như nó đang cư xử theo cách tôi muốn, vì vậy việc cung cấp không có một số lỗi lầm ngây thơ mà tôi đã làm, tôi sẽ đi với nó. Tôi không thể nói với bạn làm thế nào nhẹ nhõm tôi để có được điều này làm việc ... –

Trả lời

4

TÔI CỐ ĐỊNH IT !!

Ahem, cho phép tôi giải thích ...

Tôi không có ý tưởng làm thế nào tôi đã đến bây giờ, nhưng tôi tìm thấy một bài viết hữu ích-sounding trên MSDN về Initialization for Objects Not in an Object Tree.

Trong đó tôi thấy ví dụ đoạn mã sau:

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

Tôi nhìn (một lần nữa, xuất sắc) ví dụ từ Laurent mà tôi đã đề cập trong câu hỏi trên, và tùy chỉnh việc sử dụng XamlReader như sau:

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

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

... 

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

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

tôi thêm BeginInit(), EndInit()UpdateLayout() (mặc dù bởi quá trình loại trừ tôi tin UpdateLayout() là chìa khóa) và bây giờ các biểu thức ràng buộc trong dynamicall của tôi y-loaded xaml đang hoạt động chính xác. Tiếng hoan hô!

+0

Nó không rõ ràng những gì bạn đã không làm trước đây. Bit chính là gì? –

+0

Ahh có trong sự phấn khích của tôi, tôi quên làm cho nó rõ ràng. Tôi đã cập nhật câu trả lời ngay bây giờ. :) –

Các vấn đề liên quan