代码之家  ›  专栏  ›  技术社区  ›  devuxer

如果WPF控件从未呈现过,它是否可能具有实际宽度和实际高度?

  •  5
  • devuxer  · 技术社区  · 14 年前

    我需要一个 Viewport3D Petzold.Media3D.ViewportInfo Window 或者以其他方式渲染它。

    我试图通过实例化 并使用以下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;
    }
    

    稍后,我将尝试使用此视口使用以下方法将鼠标位置转换为三维位置:

    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;
    }
    

    不幸的是,它不起作用。我想原因是 ActualWidth ActualHeight 视口的属性都是零(并且这些属性是只读的,所以我不能手动设置它们)(注意:我用一个实际的渲染器测试了完全相同的方法 视口3D

    你知道我怎样才能让WPF分配 实际高度 基于 Width Height 设置?

    我试着设置 HorizontalAlignment VerticalAlignment Left Top MinWidth MinHeight ,但这些属性对 实际宽度 实际高度 .

    1 回复  |  直到 11 年前
        1
  •  5
  •   gehho    14 年前

    从MSDN主题 ActualWidth 属性:

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

    因此,这听起来像是一个渲染过程是必要的属性设置。不过,你可以试着打电话 Measure(Size) 然后 Arrange(Rect)