获取画布中UserControl的渲染大小

时间:2011-12-28 20:24:34

标签: c# wpf silverlight

我需要为Canvas添加几个用户控件。 UserControl的尺寸取决于ItemsControl的{​​{1}}中的商品数量。要正确定位控件并在用户控件之间绘制互连线,我需要父画布的绝对宽度/高度w.r.t.如何获得这些? UserControlActualHeight返回0。

我之前曾问过similar question,但无法得到正确答案。

编辑:添加XAML od UserControl

ActualWidth

5 个答案:

答案 0 :(得分:2)

您可以执行此操作的几个选项,强制拨打Window.MeasureWindow.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)

ActualWidthActualHeight仅在呈现控件后才起作用。

要获得所需的控件大小,您需要通过调用它的Measure方法让它自行测量。之后,您可以使用DesiredSize属性,该属性将包含您寻找的值。

Charles Petzold也有一篇很好的文章处理类似的情况:

Thinking Outside the Grid

答案 3 :(得分:1)

我正在积极创建一个Silverlight时间轴控件,我没有按照之前的海报建议做一些措施。我只是等待最后的onsize调用或其他依赖属性OnChanged事件。

以下是我加载具有画布的控件的操作:

  1. 订阅用户控件的已加载事件(,这是所有相关加载事件调用的目标,以及(步骤#2)中的大小事件)。
  2. 订阅Size Changed事件(调用#1中提到的控件加载事件)。
  3. 所有依赖属性OnXXXPropertyChanged事件都调用OnLoad(#1)。
  4. 在加载的事件中,我检查this.ActualWidth被设置(非零)以及我的所有依赖属性是否有效。 (如果它们都未设置,并且我的布尔全局标志表明它尚未加载;它什么都不做并退出(等待后续调用)。
  5. 一旦我的加载事件检测到所有相关属性已设置且ActualWidth不为零,它就会开始使用宽度和从属属性开始创建子控件的过程。
  6. HTH

答案 4 :(得分:0)

在根元素处使用Canvas-Panel而不是Grid-Panel并访问Loaded事件处理程序中的ActualWidth应该可以正常工作。 这篇文章帮助了http://msdn.microsoft.com/en-us/library/ms745058.aspx