2010-08-12 24 views
14

Tôi xem đây là một yêu cầu khá đơn giản, nhưng dường như tôi không thể tìm ra câu trả lời kết luận trong tìm kiếm của mình. Làm thế nào tôi có thể xác định giới hạn của một phần tử hình ảnh cụ thể trong cửa sổ của tôi, liên quan đến một số phần tử cha khác?Xác định giới hạn biên của phần tử WPF so với một số phụ huynh

Tôi đã thử sử dụng LayoutInformation.GetLayoutSlot nhưng điều này dường như chỉ trả về một số Rect ở 0,0 và không phản ánh vị trí thực tế của phần tử.

Điều tôi đang cố làm là chụp "ảnh chụp màn hình" của cửa sổ bằng cách sử dụng RenderTargetBitmap và sau đó cắt nó thành một phần tử cụ thể, nhưng tôi không thể nhận được giới hạn của phần tử để biết cần cắt ảnh bitmap nào!

Trả lời

15

Nó là khá đơn giản:

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

Trong thực tế nó có thể là quá mức cần thiết để đặt nó trong một phương pháp riêng biệt.

+3

'GetLayoutSlot' lấy khoảng trống được phân bổ trong bố cục cho phần tử, nhưng kích thước phần tử thực tế có thể khác nếu nó có chiều rộng/chiều cao và/hoặc biến đổi rõ ràng. Để có được kích thước "true" rect, hãy thử 'element.RenderTransform.TransformBounds (new Rect (element.RenderSize))'. – nmclean

3

Nevermind, cuối cùng tôi quản lý để tìm nó bằng cách sử dụng một sự kết hợp của LayoutInformation.GetLayoutSlot() (mặc dù tôi có thể có thể đã sử dụng một trong hai ActualWidth/ActualHeight hoặc RenderSize) và UIElement.TranslatePoint().

Có vẻ một giải pháp khá phức tạp khi nó có thể đơn giản như thế này:

myElement.GetBounds(relativeElement); 

Oh tốt. Có lẽ thời gian cho một phương pháp mở rộng. :)

+1

Không có phương pháp GetBounds trong FrameworkElement. – ygoe

+1

Tôi đã nói phải có. – devios1

+1

Bạn vui lòng hiển thị giải pháp hoàn chỉnh? Tôi đã không làm cho nó hoạt động. Nó luôn luôn sai liên quan đến một số yếu tố cha mẹ. Bây giờ, tôi đang chuyển đổi mọi thứ thành các tọa độ màn hình với 'myElement.PointToScreen (điểm mới())', điều này có thể xử lý WM_NCHITTEST. Nhưng tôi vẫn coi nó là một hack. – ygoe

3

Tùy chọn LayoutSlot không hoạt động đối với tôi chút nào. này đã kết thúc đem lại cho tôi một vị trí tương đối so với con một điều khiển/tổ tiên cha mẹ quy định:

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

Điều này làm việc cho tôi, câu trả lời được chấp nhận thì không. Làm việc với một Border trong một Grid với WPF trong .NET Framework 4.5.2. – pauldendulk

0

Có tính đến một vài gợi ý tôi tìm thấy ở đây này giải quyết vấn đề đối với tôi.

item.TransformToVisual(relativeToElement) 
    .TransformBounds(new Rect(item.RenderSize)); 
Các vấn đề liên quan