2010-06-01 9 views
5

Necesito un Viewport3D con el único propósito de hacer cálculos geométricos usando Petzold.Media3D.ViewportInfo. Preferiría no tener que colocarlo en un Window o hacerlo de otra forma.¿Es posible que un control WPF tenga un Ancho real y una Altura real si nunca se ha procesado?

Estoy intentando lograr esto creando una instancia de un Viewport3D y fijando algunas características con el siguiente método de 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; 
} 

Más tarde, estoy de intentar utilizar este visor para convertir la ubicación del ratón a una Ubicación 3D con este método:

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

Lamentablemente, no está funcionando. Creo que la razón es que ActualWidth y ActualHeight de la ventana gráfica son cero (y estas son propiedades de solo lectura, por lo que no puedo configurarlas manualmente). (Nota:. He probado el mismo método exacto con una real prestado Viewport3D, y ha funcionado muy bien, así que sé que el problema no es con mi método de convertidor)

alguna idea de cómo puedo conseguir WPF para asignar el ActualWidth y ActualHeight de un control basado en las configuraciones Width y Height?

I intentado fijar la HorizontalAlignment y VerticalAlignment a Left y Top, respectivamente, y también he metido con el MinWidth y MinHeight, pero ninguna de estas propiedades tenido ningún efecto sobre la ActualWidth o ActualHeight.

Respuesta

5

De MSDN tema de la propiedad ActualWidth:

Esta propiedad es un valor calculado en base a otras entradas de ancho, y el sistema de diseño. El propio sistema de disposición establece el valor, basado en un pase de renderizado real, y por lo tanto puede quedar un poco por detrás del valor establecido de propiedades tales como Ancho que son la base del cambio de entrada.

Por lo tanto, esto suena como un pase de representación es necesario para la propiedad que se establezca. Sin embargo, puede intentar llamar al Measure(Size) y luego al Arrange(Rect) para simular el proceso de diseño. Tal vez esto ya es suficiente.

+0

Funciona como un encanto, gracias. – devuxer

+0

Genial, me alegra que funcione. También aprendí algo nuevo aquí. :) – gehho

Cuestiones relacionadas