2010-06-01 4 views
5

Petzold.Media3D.ViewportInfo을 사용하여 기하학적 계산을 수행하는 유일한 목적으로 Viewport3D이 필요합니다. 나는 그것을 Window에 넣지 않거나 그렇지 않으면 렌더링하지 않는 것을 선호합니다.WPF 컨트롤이 렌더링되지 않은 경우 ActualWidth 및 ActualHeight를 가질 수 있습니까?

나는 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이 모두 0이기 때문입니다 (그리고 이들은 읽기 전용 속성이므로 수동으로 설정할 수는 없습니다). (참고 : 정확히 동일한 메서드를 실제 렌더링 된 Viewport3D으로 테스트 했으므로 문제가 내 변환기 메서드와 관련이 없다는 것을 알 수 있으므로 문제가 없습니다.

ActualWidth을 할당하려면 어떻게해야합니까? WidthHeight 설정을 기반으로 한 컨트롤의 ActualHeight?

나는 각각 LeftTop,에 HorizontalAlignmentVerticalAlignment을 설정했는데, 나는 또한 MinWidthMinHeight로 엉망이 있지만, 이러한 속성 중 어느 것도 ActualWidth 또는 ActualHeight상의 어떤 영향을 미치지 않았다. ActualWidth 속성 MSDN 항목에서

답변

5

:

이 속성은 다른 입력 폭에 기초하여 계산 된 값, 및 레이아웃 시스템이다. 이 값은 실제 렌더링 패스을 기반으로하는 레이아웃 시스템 자체 ()에 의해 설정되므로 입력 변경의 기준이되는 너비와 같은 속성의 설정 값보다 약간 뒤떨어 질 수 있습니다.

따라서 속성을 설정하려면 렌더링 패스가 필요합니다. 그러나 Measure(Size)을 호출 한 다음 Arrange(Rect)을 호출하여 레이아웃 프로세스를 시뮬레이션 할 수 있습니다. 어쩌면 이것은 이미 충분할 것입니다.

+0

매력처럼 작동합니다. – devuxer

+0

멋지다. 다행이다. 또한 새로운 것을 배웠습니다. :) – gehho

관련 문제