8

我正在XamlReader成功使用来加载一个 xaml 文件并创建一个FrameworkElement可以使用的文件。

我正在加载的 xaml 中包含绑定表达式,例如:

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

如果我将返回的 FrameworkElementXamlReader.Load()放入 WPF 窗口,则绑定一切正常。

但是,在这种情况下,我使用的是Laurent Bugnion 关于从 WPF/XAML 创建 PNG 的优秀文章。由于 的结果XamlReader.Load()通过 a 直接写入 PNG VisualBrush,因此似乎绕过了 WPF 调用绑定表达式的必要机制。

这让我相信实际的绑定并没有真正通过调用来调用XamlReader.Load(),或者它们没有工作是因为我不知道与没有可视化树有关的事情,直到你添加FrameworkElement到现有的视觉树或其他东西。

我可以做些什么来确保调用这些绑定吗?

提前谢谢了。

4

1 回答 1

5

我修好了它!!

咳咳,请允许我解释一下……

我不知道我现在是怎么做到的,但是我在 MSDN 上找到了一篇关于Initialization for Objects Not in an Object Tree 的文章,听起来很有帮助。

在其中我找到了以下代码示例:

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

我查看了我在上面的问题中提到的来自 Laurent 的(再次非常出色的)示例,并自定义了XamlReader如下的使用:

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

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

...

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

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

我添加了BeginInit(), EndInit()and UpdateLayout()(虽然我认为消除过程UpdateLayout()是关键),现在动态加载的 xaml 中的绑定表达式可以正常工作。欢呼!

于 2011-09-22T13:48:32.930 回答