我需要为Canvas添加几个用户控件。 UserControl
的尺寸取决于ItemsControl
的{{1}}中的商品数量。要正确定位控件并在用户控件之间绘制互连线,我需要父画布的绝对宽度/高度w.r.t.如何获得这些? UserControl
和ActualHeight
返回0。
我之前曾问过similar question,但无法得到正确答案。
编辑:添加XAML od UserControl
ActualWidth
答案 0 :(得分:2)
您可以执行此操作的几个选项,强制拨打Window.Measure
和Window.Arrange
将会计算所有值,或者您可以在Window.Loaded
事件中获取这些值。已经讨论过同样的问题on this question。
如果您正在考虑内容:
window.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
window.Arrange(new Rect(0, 0, window.DesiredWidth, window.DesiredHeight));
如果您使用的是明确的窗口大小:
window.Measure(new Size(Width, Height));
window.Arrange(new Rect(0, 0, window.DesiredWidth, window.DesiredHeight));
或
public MyWindow()
{
Loaded += delegate
{
// access ActualWidth and ActualHeight here
};
}
答案 1 :(得分:1)
这已经很久了,但几年前我做了类似的事情。我现在不记得所有的细节,今晚我有更多的时间,我会看看这个。我想让你快速了解为什么你的大小为0。
这主要是因为WPF中的布局系统发生了两次传递,测量和排列传递。首先,容器控件(在您的情况下为Panel)询问其子项的大小,一旦完成此过程,容器将使用它们在度量过程中计算的大小来安排它们。
我建议阅读这篇关于测量和安排儿童部分的MSDN文章。 http://msdn.microsoft.com/en-us/library/ms745058.aspx
如果这没有帮助,请告诉我,我会花更多时间来回忆所有细节。
根据您的编辑,您可能需要查看此帖子,了解如何创建与线条相关联的对象。 http://denisvuyka.wordpress.com/2007/10/21/wpf-diagramming-drawing-a-connection-line-between-two-elements-with-mouse/
我认为这更倾向于您的确切情况。
答案 2 :(得分:1)
ActualWidth
和ActualHeight
仅在呈现控件后才起作用。
要获得所需的控件大小,您需要通过调用它的Measure
方法让它自行测量。之后,您可以使用DesiredSize
属性,该属性将包含您寻找的值。
Charles Petzold也有一篇很好的文章处理类似的情况:
答案 3 :(得分:1)
我正在积极创建一个Silverlight时间轴控件,我没有按照之前的海报建议做一些措施。我只是等待最后的onsize调用或其他依赖属性OnChanged事件。
以下是我加载具有画布的控件的操作:
HTH
答案 4 :(得分:0)
在根元素处使用Canvas-Panel而不是Grid-Panel并访问Loaded事件处理程序中的ActualWidth应该可以正常工作。 这篇文章帮助了http://msdn.microsoft.com/en-us/library/ms745058.aspx