2010-08-12 56 views
14

Bunu oldukça basit bir istek olarak görüyorum, ancak aramalarımda kesin bir yanıt bulamıyorum. Penceremdeki belirli bir görsel öğenin sınırlarını başka bir ana öğeye göre nasıl belirleyebilirim?Bazı üst öğelere göre bir WPF öğesinin sınırlayıcı rektini belirleyin.

LayoutInformation.GetLayoutSlot kullanmayı denedim, ancak bu yalnızca Rect değerini 0,0 olarak döndürüyor ve öğenin gerçek konumunu yansıtmıyor gibi görünüyor.

Yapmaya çalıştığım şey, bir pencerenin "ekran görüntüsünü" RenderTargetBitmap kullanarak almak ve daha sonra belirli bir öğeye kırpmaktır, ancak bitmap'i kırpmak için öğenin sınırlarını alamıyorum!

cevap

15

Oldukça basit: overkill olabilir Aslında

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

ayrı yöntemle koymak.

+3

'GetLayoutSlot', öğeye ilişkin düzende ayrılan alanı alır, ancak gerçek öğe boyutu, açık bir genişlik/yükseklik ve/veya bir dönüşüme sahipse farklı olabilir. "Doğru" boyutta rect almak için, element.RenderTransform.TransformBounds (yeni Rect (element.RenderSize)) 'ı deneyin. – nmclean

3

Boşverin, nihayet ve UIElement.TranslatePoint() (muhtemelen ActualWidth/ActualHeight veya RenderSize ya kullanılmış olabilir rağmen) LayoutInformation.GetLayoutSlot() bir arada kullanarak bunu anlamaya başardı. iyi

myElement.GetBounds(relativeElement); 

Ah:

bu kadar basit olabilir oldukça karmaşık bir çözüm gibi görünüyor. Belki bir uzatma yöntemi için zaman. :)

+1

FrameworkElement'te GetBounds yöntemi yoktur. – ygoe

+1

Olması gerektiğini söylüyordum. – devios1

+1

Tam çözümü gösterebilir misiniz? Onu işe almadım. Bazı ana öğelere göre daima yanlıştı. Şimdilik, her şeyi WM_NCHITTEST işlemek için uygun olan myElement.PointToScreen (new Point()) 'ile ekran koordinatlarına dönüştürüyorum. Ama yine de bir hack olduğunu düşünüyorum. – ygoe

3

LayoutSlot seçeneği benim için hiç işe yaramadı.

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

Bu benim için çalıştı, kabul edilen cevap vermedi. .NET Framework 4.5.2'de WPF ile bir Izgarada Kenarlık ile Çalışma. – pauldendulk

0

bu benim için sorun çözüldü dikkate Burada bulunan birkaç öneri çıkarak: Bu belirtilen bir ebeveyn/atası kontrolüne bana bir çocuk konumunu veren sona erdi.

item.TransformToVisual(relativeToElement) 
    .TransformBounds(new Rect(item.RenderSize));