2010-06-01 11 views
5

Ho bisogno di un Viewport3D per il solo scopo di fare calcoli geometrici utilizzando Petzold.Media3D.ViewportInfo. Preferirei non doverlo posizionare in un Window o altrimenti renderlo.E 'possibile che un controllo WPF abbia un ActualWidth e ActualHeight se non è mai stato reso?

Sto tentando di raggiungere questo istanziando un Viewport3D e impostando alcune proprietà utilizzando il seguente metodo di 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; 
} 

Più tardi, sto cercando di utilizzare questa finestra per convertire la posizione del mouse ad un Posizione 3D utilizzando questo metodo:

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

Sfortunatamente, non funziona. Penso che il motivo sia che lo ActualWidth e il ActualHeight del viewport sono entrambi zero (e queste sono proprietà di sola lettura, quindi non posso impostarle manualmente). (Nota:. Ho testato lo stesso metodo esatto con un vero e proprio reso Viewport3D, ed ha funzionato benissimo, quindi so che il problema non è con il mio metodo convertitore)

Qualsiasi idea di come posso ottenere WPF per assegnare il ActualWidth e ActualHeight di un controllo basato sulle impostazioni Width e Height?

Ho provato a regolare il HorizontalAlignment e VerticalAlignment a Left e Top, rispettivamente, e sono anche pasticciato con il MinWidth e MinHeight, ma nessuna di queste proprietà avuto alcun effetto sul ActualWidth o ActualHeight.

risposta

5

Da MSDN argomento per la proprietà ActualWidth:

Questa proprietà è un valore calcolato sulla base di altri fattori di larghezza, e il sistema di layout. Il valore è impostato dal sistema di layout stesso, in base a un passaggio di rendering effettivo, e potrebbe quindi essere leggermente indietro rispetto al valore impostato di proprietà come Larghezza che sono alla base della modifica dell'input.

Quindi, questo suona come un passaggio di rendering è necessaria per la proprietà da impostare. Tuttavia, è possibile provare a chiamare Measure(Size) e quindi a Arrange(Rect) per simulare il processo di layout. Forse questo è già sufficiente.

+0

Funziona come un incanto, grazie. – devuxer

+0

Fantastico, sono contento che funzioni. Anche imparato qualcosa di nuovo qui. :) – gehho