我仅需要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;
}
不幸的是,它不起作用。我认为原因是视口的
ActualWidth
和ActualHeight
均为零(并且这些都是只读属性,因此我不能手动设置它们)。 (注意:我已经使用实际呈现的Viewport3D
测试了完全相同的方法,并且效果很好,所以我知道问题不在我的转换器方法上。)知道如何让WPF根据
ActualWidth
和ActualHeight
设置分配控件的Width
和Height
吗?我尝试将
HorizontalAlignment
和VerticalAlignment
分别设置为Left
和Top
,并且也弄乱了MinWidth
和MinHeight
,但是这些属性都没有对ActualWidth
或ActualHeight
。 最佳答案
来自MSDN主题的ActualWidth
属性:
此属性是基于其他宽度输入和布局系统的计算值。该值是由布局系统本身根据实际渲染过程设置的,因此可能略微落后于作为输入更改基础的诸如Width之类的属性的设置值。
因此,这听起来好像需要设置渲染传递才能设置该属性。但是,您可以尝试先调用Measure(Size)
,然后再调用Arrange(Rect)
以模拟布局过程。也许这已经足够了。