Pergunta

Considero isso um pedido bastante simples, mas não consigo encontrar uma resposta conclusiva em minhas pesquisas. Como posso determinar os limites de um elemento visual específico na minha janela, em relação a outro elemento pai?

Eu tentei usar LayoutInformation.GetLayoutSlot Mas isso parece retornar um Rect em 0,0 e não reflete a localização real do elemento.

O que estou tentando fazer é tirar uma "captura de tela" de uma janela usando RenderTargetBitmap E depois corte -o para um elemento específico, mas não consigo obter os limites do elemento para saber o que cortar o bitmap!

Foi útil?

Solução

É bastante simples:

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

De fato, pode ser um exagero colocá -lo em um método separado.

Outras dicas

A opção LayoutSlot não funcionou para mim. Isso acabou me dando uma posição de criança em relação a um controle especificado de pai/ancestral:

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

Esquecendo, finalmente consegui descobrir usando uma combinação de LayoutInformation.GetLayoutSlot() (embora eu provavelmente pudesse ter usado ActualWidth/ActualHeight ou RenderSize) e UIElement.TranslatePoint().

Parece uma solução bastante complicada quando pode ser tão simples quanto este:

myElement.GetBounds( relativeElement );

Ah bem. Talvez seja hora de um método de extensão. :)

Levando em conta algumas sugestões que encontrei aqui, isso resolveu o problema para mim.

item.TransformToVisual( relativeToElement )
    .TransformBounds( new Rect( item.RenderSize ) );
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top