Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取WPF中控件的可见大小_C#_Wpf - Fatal编程技术网

C# 获取WPF中控件的可见大小

C# 获取WPF中控件的可见大小,c#,wpf,C#,Wpf,我有一个控件没有完全显示(通过减小窗口大小)。 但此控件的ActualWidth和RenderSize/DesiredSize仍显示其总大小。 我编写了下一个代码,但它忽略了窗口的滚动条宽度,看起来很难看。 也许有一种方法可以以更优雅的方式获得可视的控制尺寸 private static double GetVisibleWidth(UIElement element, FrameworkElement container) { var visibleBounds

我有一个控件没有完全显示(通过减小窗口大小)。 但此控件的ActualWidth和RenderSize/DesiredSize仍显示其总大小。 我编写了下一个代码,但它忽略了窗口的滚动条宽度,看起来很难看。 也许有一种方法可以以更优雅的方式获得可视的控制尺寸

    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;
    }
可能是您所需要的

返回表示元素可见区域的几何图形

但是请注意,如果
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中时,这将不起作用,因为它在技术上没有剪裁。

LayoutFormation.GetLayoutClip为元素及其可视父元素返回null。我认为IsMeasureValis在我的情况下是错误的。