我有一个WPF用户控件,我们将它命名为MyControl,它有一个包含一些绘图视觉的网格和包含在另一个网格中的相同网格。 MyControl的宽度和高度绑定到UserControl的Width和Height属性.AndiceControl包含包含Drawing Visual的网格。
然后我有另一个WPF用户控件,它创建N个MyControl并将它们放在Dock面板中。
我面临的问题是每当我访问任何MyControl的Width和Height属性时,它们实际上都是NaN。
以下是我的DockPanel声明:
<DockPanel x:Name="layout" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
</DockPanel>
其他控件在运行时初始化。这可能是导致这种情况发生的原因。另外还有一些奇怪的事情 - MyControl在用作单个控件时似乎行为正常,但每当我尝试使用包含N个控件的控件时,事件似乎就搞乱了。
可能是因为Binding还没有发生?事实上Binding何时实际发生,所以我可以确定它们是Binded?
Container = new Container(Data);
Container.SetBinding(Grid.WidthProperty, new Binding("Width") { Source = this });
Container.SetBinding(Grid.HeightProperty, new Binding("Height") { Source = this });
grid.Children.Add(Container);
myControl.AddChild(grid);
这是我如何将内部网格绑定到UserControl的大小。
我通过将Container的类Grid绑定到UserControl的Actual width属性来解决我的问题,如下所示:
Container.SetBinding(Grid.WidthProperty, new Binding("ActualWidth") { Source = this });
Container.SetBinding(Grid.HeightProperty, new Binding("ActualHeight") { Source = this });
喜欢这样。
答案 0 :(得分:2)
首先,您应该使用ActualWidth
和ActualHeight
属性来获取控件的大小。
其次,您需要让WPF执行布局传递以设置实际大小。这通常应该在Loaded事件或其他地方完成。
最后,你不应该自己读写大小,你应该设置布局,以便WPF自己调整大小。
答案 1 :(得分:1)
如果您想知道实际当前大小,请使用ActualWidth和ActualHeight属性。
Width和Height属性返回NaN,因为这意味着未指定或显式设置Width和Height,因此WPF可以自动确定(所需)大小。
答案 2 :(得分:0)
NaN的意思是“未设置”。 FrameworkElement是WPF中许多控件的基类,如果没有显式设置Height和Width属性,那么在类构造函数中将是NaN的默认值。
在这种情况下,尝试获取ActualWidth,而不是Width和ActualHeight而不是Height: