2016-04-28 77 views
3

我有一個控件不能完全顯示(通過減小窗口大小)。 但是該控件的ActualWidth和RenderSize/DesiredSize仍然顯示它的總大小。 我寫了下面的代碼,但它忽略了窗口的滾動條寬度,看起來很醜。 也許有辦法以更優雅的方式獲得可見的控制大小?在WPF中獲取可見的控件大小

private static double GetVisibleWidth(UIElement element, FrameworkElement container) 
    { 
     var visibleBounds = 
      element.TransformToAncestor(container) 
       .TransformBounds(new Rect(new Point(0, 0), element.RenderSize)); 

     double visibleWidth = element.RenderSize.Width; 
     if (container != null) 
     { 
      visibleWidth = Math.Min(container.ActualWidth - visibleBounds.X, visibleWidth); 
     } 

     return visibleWidth; 
    } 

What size i am speaking about

回答

0

LayoutInformation.GetLayoutClip可能是你所需要的。

返回一個表示元素可見區域的幾何。

但是請注意,如果element.IsArrangeValid && element.IsMeasureValid == false,這將返回null。這裏是你可以使用的方法:

private Size GetVisibleSize(FrameworkElement element) 
{ 
    Rect? bounds = LayoutInformation.GetLayoutClip(element)?.Bounds; 
    if (bounds == null) 
    { 
     return new Size(element.ActualWidth, element.ActualHeight); 
    } 
    return new Size(bounds.Value.Width, bounds.Value.Height); 
} 

當你的元素是的ScrollViewer內,雖然,因爲它在技術上並不剪裁這是行不通的。

+0

LayoutInformation.GetLayoutClip爲元素及其可視父項返回null。我認爲IsMeasureValis在我的情況下是錯誤的。 – digger