查找用户控件的ActualWidth

4
我正在使用XAML/C#进行一些布局工作,由于某些原因,我不能使用SizeToContent="Width"选项,但是我希望在某些情况下模拟它。我有一个用户控件坐落在扩展器内部,我想能够获取该用户控件的实际宽度,以便在扩展器展开时可以相应地增加GridColumn和窗口的大小。由于扩展器最初为IsExpanded="False",因此ActualWidth属性读取为0.0。是否有任何方法可以获取用户控件的ActualWidth,就好像它完全可见并且SizeToContent="Width"生效一样?
我一直在拼命尝试想出如何计算这个宽度,而不是硬编码实际值。当扩展器折叠时,DesiredSize.WidthRenderedSize.Width也都返回0.0。

如果你有 INotifyPropertyChanged,你可以直接附加一个 DataTrigger 并将其绑定到 ActualWidth,这样当绑定更新时,你的属性也会被更新吗?这是一个注释,因为我很遗憾没有时间测试,但似乎是一个合法的选项。 - Chris W.
@ChrisW。我会记住这个建议,但我不确定这种方法是否适合这种情况。 - Jesse Carter
1个回答

2

我相信如果你运行一个传入无限SizeMeasure pass,你将能够获得DesiredSize

var infiniteSize = new Size(double.PositiveInfinity, double.PositiveInfinity);
control.Measure(infiniteSize);

control.Arrange(new Rect(infiniteSize));

更正:

如评论所述,只需使用无限的Size调用Measure()即可完成;不要使用Arrange()


抛出 System.InvalidOperationException 异常:无法在具有无限大小或 NaN 的 UIElement 上调用排列。 - Jesse Carter
Jay,这个代码可以正常工作,不需要调用Arrange()方法。在Measure之后,我可以从DesiredSize属性中获取完全展开的宽度和高度。 - Jesse Carter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接