2011-02-22 14 views
5

Para una versión simplificada de mi problema, me gustaría calcular el cuadro delimitador de una forma de diseño transformado (posiblemente incluso renderizado), de modo que siempre pueda ajustar un rectángulo perfectamente alrededor de la forma, sin importar su rotación o escala puede ser. Si puedes resolver esto, seré feliz.Obteniendo el verdadero cuadro delimitador visual de un elemento WPF?

El problema más complejo es el de calcular el cuadro delimitador visual de cualquier elemento de marco. Por 'cuadro delimitador visual' me refiero a que el píxel superior visible dentro del elemento marco determina el límite superior, el píxel derecho más visible determina el límite derecho, etc. Si puede resolver esto, estaré aún más feliz .

He intentado jugar con LayoutInformation.GetLayoutSlot(), pero esto no funcionó de la manera esperada. La "ranura de disposición" era en realidad MUCHO más grande que los límites reales. También intenté usar VisualTreeHelper.GetDescendantBounds(), pero debido a que VisualParent de la forma de prueba estaba protegida, no pude acceder a esta propiedad, y decidí consultar aquí antes de ir más allá.

Espero que alguien pueda proporcionar una forma fácil de obtener el cuadro visual de un elemento en WPF, que se calcula DESPUÉS de todas las transformaciones. Si no he dejado algo claro en mi pregunta, házmelo saber.

Respuesta

4

Obtendrá buenos resultados con VisualTreeHelper.GetDescendantBounds() y puede usar VisualTreeHelper.GetParent() para obtener acceso a la propiedad VisualParent que de otro modo estaría protegida. Sin embargo, lo que probablemente quiera hacer es llamar al GetDescendantBounds en la forma en sí, no a su padre, porque a pesar de su nombre, el método devuelve los límites del padre y de todas sus descendencias.

+0

Cuando hago 'GetDescendantBounds()' en mi forma, devuelve un rectángulo que es los límites de la forma original no transformada, a pesar de cualquier transformación en la forma. Si obtengo el padre de la forma usando 'GetParent()' y luego echo sobre ese padre a un Visual, y paso ese Visual al 'GetDescendantBounds()', devuelve un rectángulo que es mucho más grande que mi forma. – Dalal

8
private Rect GetRectOfObject(FrameworkElement _element) 
{ 
    Rect rectangleBounds = new Rect(); 
    rectangleBounds = _element.RenderTransform.TransformBounds(new Rect(0, 0, _element.Width, _element.Height)); 
    return rectangleBounds; 
} 

Quizás esto ayude.

+8

'new Rect (0, 0, _element.Width, _element.Height)' se puede simplificar a 'new Rect (_element.RenderSize)'. – nmclean

0

El problema no es fácil, ya que un control puede dibujar fuera de sus límites. Pero si supone que esto no sucede, puede resolver el problema utilizando parent.TranslatePoint (point_in_child_coord_system, child) para transformar (0,0) (child.ActualWidth, 0) (child.ActualWidth, child.ActualHeight) y (0 , child.ActualHeight) al sistema de coord de padres. Luego, ordena las coordenadas xey de todos los puntos y usa valores mínimos y máximos para encontrar el cuadro delimitador. Nota: la clasificación es necesaria debido a la posible rotación de niños.

Cuestiones relacionadas