一个WPF控件如果从未被渲染,是否可能具有ActualWidth和ActualHeight属性?

5
我需要一个Viewport3D,只是为了使用Petzold.Media3D.ViewportInfo进行几何计算。我希望不必将其放置在Window或以其他方式呈现。
我尝试通过实例化Viewport3D并使用以下C#方法设置一些属性来完成此操作:
private Viewport3D CreateViewport(MainSettings settings)
{
    var cameraPosition = new Point3D(0, 0, settings.CameraHeight);
    var cameraLookDirection = new Vector3D(0, 0, -1);
    var cameraUpDirection = new Vector3D(0, 1, 0);
    var camera = new PerspectiveCamera
    {
        Position = cameraPosition,
        LookDirection = cameraLookDirection,
        UpDirection = cameraUpDirection
    };
    var viewport = new Viewport3D
    {
        Camera = camera,
        Width = settings.ViewportWidth,
        Height = settings.ViewportHeight
    };
    return viewport;
}

接下来,我尝试使用这个视口来使用以下方法将鼠标位置转换为3D位置:

public Point3D? Point2dToPoint3d(Point point)
{
    var range = new LineRange();
    var isValid = ViewportInfo.Point2DtoPoint3D(_viewport, point, out range);
    if (isValid)
        return range.PointFromZ(0);
    else
        return null;
}

很不幸,它没有起作用。我认为原因是视口的ActualWidthActualHeight都为零(这些是只读属性,因此我无法手动设置它们)。 (注意:我已经使用实际呈现的Viewport3D测试了完全相同的方法,它可以正常工作,因此我知道问题不在于我的转换器方法。)
有什么办法可以让WPF根据WidthHeight设置来分配控件的ActualWidthActualHeight吗?
我尝试将HorizontalAlignmentVerticalAlignment设置为LeftTop,并且还调整了MinWidthMinHeight,但是这些属性对ActualWidthActualHeight没有任何影响。
1个回答

5
ActualWidth属性的MSDN主题中可以得知:
这个属性是基于其他宽度输入和布局系统计算出的值。该值由布局系统本身根据实际渲染过程设置,因此可能会稍微滞后于诸如Width之类的属性设置的基础输入变化值。
因此,这听起来需要进行一次渲染才能设置该属性。但是,您可以尝试调用Measure(Size)然后再调用Arrange(Rect)模拟布局过程。也许这已经足够了。

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