2010-06-01 13 views
5

Potrzebuję Viewport3D wyłącznie w celu wykonywania obliczeń geometrycznych przy użyciu Petzold.Media3D.ViewportInfo. Wolałbym nie umieszczać go w postaci Window lub w inny sposób renderować go.Czy jest możliwe, aby formant WPF miał ActualWidth i ActualHeight, jeśli nigdy nie był renderowany?

ja próbuje osiągnąć poprzez utworzenie wystąpienia Viewport3D i ustawienie kilku właściwości, stosując następujące metody 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; 
} 

Później, ja próbuje wykorzystać tę rzutnię do konwertowania lokalizację myszy w Lokalizacja 3D przy użyciu tej metody:

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

Niestety, to nie działa. Myślę, że powodem jest, że ActualWidth i ActualHeight z rzutni są zerem (i są to właściwości tylko do odczytu, więc nie mogę ich ustawić ręcznie). (Uwaga:. Ja testowałem dokładnie ten sam sposób o rzeczywistym renderowane Viewport3D, i to działało dobrze, więc wiem, że problem nie jest z mojej metody konwertera)

jakiś pomysł jak mogę uzyskać WPF przypisać ActualWidth i ActualHeight sterowania na podstawie ustawień Width i Height?

Próbowałem ustawienie HorizontalAlignment i VerticalAlignment do Left i Top, odpowiednio, i ja również pomieszane z MinWidth i MinHeight, ale żadna z tych właściwości miał żadnego wpływu na ActualWidth lub ActualHeight.

Odpowiedz

5

Od MSDN temat dla własności ActualWidth:

Ta właściwość jest wartością obliczoną na podstawie innych wejść szerokości, a system układ. Wartość jest ustalana przez sam układ układu, na podstawie rzeczywistego przebiegu renderowania, a zatem może pozostawać nieco za ustawioną wartością właściwości, takich jak Szerokość, które są podstawą zmiany wejścia.

Wygląda na to, że przekazanie renderingu jest niezbędne do ustawienia nieruchomości. Można jednak spróbować wywołać Measure(Size), a następnie Arrange(Rect), aby symulować proces układania. Może to już wystarczy.

+0

Działa jak wdzięk, dzięki. – devuxer

+0

Fajnie, cieszę się, że to działa. Nauczyłem się też czegoś nowego tutaj. :) – gehho

Powiązane problemy