5

我需要一个Viewport3D用于进行几何计算的唯一目的Petzold.Media3D.ViewportInfo。我宁愿不必将它放在 a 中Window或以其他方式渲染它。

我试图通过Viewport3D使用以下 C# 方法实例化 a 并设置一些属性来完成此操作:

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都是零(这些是只读属性,所以我不能手动设置它们)。(注意:我已经用实际的 render 测试了完全相同的方法Viewport3D,并且效果很好,所以我知道问题不在于我的转换器方法。)

知道如何让 WPF根据and设置分配控件的ActualWidthand吗?ActualHeightWidthHeight

我尝试将HorizontalAlignmentand分别设置为 and ,我也弄乱了VerticalAlignmentand Left,但是这些属性都没有对or产生任何影响。TopMinWidthMinHeightActualWidthActualHeight

4

1 回答 1

5

来自该属性的 MSDN 主题ActualWidth

此属性是基于其他宽度输入和布局系统的计算值。该值由布局系统本身根据实际渲染过程设置,因此可能会稍微落后于作为输入更改基础的 Width 等属性的设置值。

因此,这听起来像是要设置属性需要渲染通道。但是,您可以尝试调用Measure(Size)然后Arrange(Rect)模拟布局过程。也许这已经足够了。

于 2010-06-01T07:47:24.213 回答