wpf背后的逻辑是GetLayoutClip()

本文关键字:GetLayoutClip 背后 wpf | 更新日期: 2023-09-27 18:14:30

据我所知,GetLayoutClip(从静态类LayoutInformation调用)将产生一个几何体,在这个几何体之外,WPF中的布局将剪辑一个UIElement(当然,如果UIElement是默认关闭剪辑的UIElement,例如Canvas)。为了更好地理解逻辑,我尝试使用Grid进行实验,但我得到了一些我发现有点奇怪的结果。我使用了下面的代码进行实验。

XAML:

<Window x:Class="TestSolution.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Width="216" Height="139" Loaded="Window_Loaded">
</Window>

和代码后面的

private Grid panel;
    public MainWindow()
    {
        InitializeComponent();
        panel = new Grid();
        panel.Margin = new Thickness(0,70,10,0);
        panel.Width = 150;
        panel.Height = 100;
        panel.ClipToBounds = true;
        Content = panel;
    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        Debug.WriteLine(panel.DesiredSize);
        Debug.WriteLine(panel.RenderSize);
        Debug.WriteLine(LayoutInformation.GetLayoutClip(panel).Bounds);
    }

注意,我正在强制cliptobound。不出所料,GetLayoutClip返回矩形=(0,0,150,30),这是完全有意义的;几何图形从GridPanel的原点开始,并剪辑窗口以下和网格宽度以外的所有内容(包括任何溢出到右侧空白的内容)。

然而,如果我们关闭cliptobound,矩形变成(-20,0,190,30)。所以-20对我来说是有意义的;相对于网格的原点,使您到达左侧窗口的边缘。0也是有意义的,因为它距离顶部70,并且正是网格在y方向上开始的位置。为什么190的宽度?网格本身终止于170和180,包括右边的边距。没有什么会自然地在190岁结束。为什么是190年?

wpf背后的逻辑是GetLayoutClip()

panel.ClipToBounds = true时,则被剪切的区域受到网格边界的限制。然而,当你将其设置为"false"时,那么内容就有可能出现在面板的左侧或右侧,并带有负边距。所以整个窗口的宽度被作为一个剪辑矩形。由于您的网格被放置在窗口的中间,并且与左边缘有-20的偏移量,那么矩形的宽度为:

width = 216 - 20 - 3 - 3 = 190.

其中3为窗口边框的大小