Determinar el rect de delimitación de un elemento de WPF en relación con algunos de los padres

StackOverflow https://stackoverflow.com/questions/3472388

  •  28-09-2019
  •  | 
  •  

Pregunta

Considero esto una simple petición bastante, pero me parece que no puede encontrar una respuesta concluyente en las búsquedas. ¿Cómo puedo determinar los límites de un elemento visual particular de mi ventana, en relación con algún otro elemento padre?

He intentado usar LayoutInformation.GetLayoutSlot pero esto sólo parece devolver un Rect en 0,0 y no refleja la situación real del elemento.

Lo que estoy tratando de hacer es tomar una "pantalla" de una ventana usando RenderTargetBitmap y después recortar a un elemento en particular, pero no puedo conseguir los límites del elemento sepan qué recortar el mapa de bits a!

¿Fue útil?

Solución

Es bastante simple:

public static Rect BoundsRelativeTo(this FrameworkElement element,
                                         Visual relativeTo)
{
  return
    element.TransformToVisual(relativeTo)
           .TransformBounds(LayoutInformation.GetLayoutSlot(element));
}

De hecho, puede ser excesiva para ponerlo en un método separado.

Otros consejos

La opción LayoutSlot no funcionó para mí en absoluto. Esto terminó dándome una posición infantil relativa a uno de los padres se ha especificado / ancestro de control:

    public static Rect BoundsRelativeTo(this FrameworkElement child, Visual parent)
    {
        GeneralTransform gt = child.TransformToAncestor(parent);
        return gt.TransformBounds(new Rect(0, 0, child.ActualWidth, child.ActualHeight));
    }

No importa, que finalmente logró averiguarlo utilizando una combinación de LayoutInformation.GetLayoutSlot() (aunque probablemente podría haber utilizado ya sea ActualWidth / o ActualHeight RenderSize) y UIElement.TranslatePoint().

Parece una solución bastante complicado cuando podría ser tan simple como esto:

myElement.GetBounds( relativeElement );

Oh, bueno. Tal vez el tiempo para un método de extensión. :)

Teniendo en cuenta algunas sugerencias que encontré aquí esta resuelto el problema para mí.

item.TransformToVisual( relativeToElement )
    .TransformBounds( new Rect( item.RenderSize ) );
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top