【问题标题】:Bindings not applied to dynamically-loaded xaml绑定不适用于动态加载的 xaml
【发布时间】:2011-11-22 20:12:24
【问题描述】:

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

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

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

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

但是,在这种情况下,我使用的是Laurent Bugnion's excellent article on creating PNGs from WPF/XAML。由于XamlReader.Load() 的结果是通过VisualBrush 直接写入PNG,因此似乎绕过了WPF 调用绑定表达式的必要机制。

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

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

非常感谢。

【问题讨论】:

  • 我确实认为 View 需要布局和渲染通道才能将其作为图像写入,并且只有当我们将其加载到可视化树上时才有可能。如果我错了,请纠正我。尽管带有 FlowDocument 的 XamlWriter 有点不同。
  • @AngelWPF 我设法解决了它并在下面发布了答案。它似乎确实表现得像我想要的那样,所以如果我没有犯一些幼稚的错误,我会继续这样做。我无法告诉你我有多么轻松地完成这项工作......

标签: c# wpf xaml binding xamlreader


【解决方案1】:

我修好了!!

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

我现在不知道我是怎么做到的,但我在 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()UpdateLayout()(尽管通过消除过程我相信UpdateLayout() 是关键),现在我动态加载的xaml 中的绑定表达式工作正常。万岁!

【讨论】:

  • 不清楚你之前没有做什么。关键是什么?
  • 啊,是的,在我兴奋的时候,我忘了说清楚。我现在已经更新了答案。 :)
猜你喜欢
  • 1970-01-01
  • 2016-10-15
  • 2015-03-28
  • 2020-01-29
  • 2023-03-29
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多