2015-02-10 72 views
0

我有一个WPF用户控件,我们将其命名为MyControl,它具有包含一些Drawing Visuals和包含在另一个网格内的同一网格的网格。 MyControl的宽度和高度绑定到UserControl的Width和Height属性。并且UserControl包含其中包含Drawing Visual的网格。NaN大小的网格

然后我有另一个WPF用户控件创建N的MyControl并将它们放置在Dock Panel中。

我面临的问题是,无论何时访问MyControl的宽度和高度属性,它们实际上都是NaN。

以下是我DockPanel中声明:

<DockPanel x:Name="layout" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
    </DockPanel> 

的其他控件在运行时初始化。这可能是导致这种情况发生的原因。另外还有一些奇怪的地方 - 每当我用它作为单个控件时,MyControl似乎都能正常运行,但每当我尝试使用包含N个控件的控件时,事件似乎都会变得混乱起来。

难道是因为绑定还没有发生?事实上,绑定实际发生时,我可以肯定他们是绑定?

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.SetBinding(Grid.WidthProperty, new Binding("ActualWidth") { Source = this }); 
     Container.SetBinding(Grid.HeightProperty, new Binding("ActualHeight") { Source = this }); 

像现在这样。

回答

2

首先,您应该使用ActualWidthActualHeight属性来获取控件的大小。

其次,您需要让WPF执行布局以实现实际尺寸设置。这通常应在Loaded事件或其他地方完成。

最后,您不应该自己读写大小,您应该设置布局,以便WPF自行确定大小。

+0

因此,我假设我可以使用ActualWidth和ActualHeight在网格实例化和绑定正确后? – Hristo 2015-02-10 10:19:31

+1

@Chris号您需要让应用程序“运行”第二次,以便WPF进行布局。在此之后发生OnLoaded事件。现在我不能说出其他可能用于类似事情的事件。 – Euphoric 2015-02-10 10:23:05

1

如果您想知道实际的当前尺寸,请使用ActualWidth和ActualHeight属性。

宽度和高度属性返回NaN,因为这意味着宽度和高度未指定或明确设置,因此WPF可以自动确定(需要的)大小。

+0

的问题是,每当我得到的容器仍然是NaN的大小,但如果我动了可视化树和找到第一个非零值,它告诉我,只有具有宽度和高度的控件是包含多个控件的控件。个别控件似乎没有任何实际大小,它们等于0.0。 – Hristo 2015-02-10 09:59:02

+1

NaN意味着宽度和高度属性设置为自动 – 2015-02-10 09:59:08

0

NaN表示“未设定”。 FrameworkElement是WPF中许多控件的基类,如果您没有明确设置Height和Width属性,那么在类构造函数中将是默认值NaN。

在这种情况下,尝试获得ActualWidth的,而不是宽和的ActualHeight,而不是高度: