我有一个自定义控件,我想在画布上渲染。在渲染之前,我必须首先计算它的大小。我有这个代码,我想在渲染之前得到控件的大小:
var customView = (Control)Activator.CreateInstance(viewModel.CustomViewType);
customView.DataContext = viewModel;
// Bindings not updated yet... I want to update them here
customView.Measure(new Size(double.MaxValue, double.MaxValue));
// Use customView.DesiredSize
但是,在分配DataContext
之后立即测量控件并不能及时更新绑定以获得适当大小的元素。如何确保在设置DataContext
后立即更新绑定,以便我可以进行正确的测量?
我在设置DataContext
:
customView.Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.DataBind);
这一行在System.InvalidOperationException
中导致WindowsBase.dll
,但没有出现问题的信息。
更新:建议的其他类似问题是Updating Binding immediately when DataContext changes。我不认为这个答案适合我的情况。因为我正在使用自定义视图(可以来自任何地方),所以如果可能的话,我希望避免强制每个视图符合MeasureOverride
的实现。此外,在测量之前调用调度程序操作会给出上述错误。