WPF' GetLayoutClip()

时间:2015-09-25 17:58:40

标签: c# wpf

据我了解,GetLayoutClip(从静态类LayoutInformation中调用)将生成一个Geometry,WPF中的布局将在其中剪切UIElement(当然,如果UIElement是剪切关闭的那个,则除外)默认 - 例如Canvas)。为了更好地理解逻辑,我尝试使用网格进行实验,但我得到了一些结果,我觉得有点奇怪。我已使用以下代码进行试验。

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

请注意,我正在强制ClipToBounds。不出所料,GetLayoutClip返回一个Rectangle =(0,0,150,30),这是完全合理的;几何体从GridPanel的原点开始,并剪切窗口下方和网格宽度之外的所有内容(包括溢出到右边边距内的任何内容)。

但是,如果我们关闭ClipToBounds,则矩形变为(-20,0,190,30)。好的,所以-20对我来说很有意义;相对于网格的原点,它将您带到左侧窗口的边缘。 0也是有意义的,因为它是从顶部开始的70,以及网格在Y方向上开始的确切位置。为什么190宽度?网格本身终止于170和180,包括右边的边距。没有什么能在190年自然结束。为什么要190?

1 个答案:

答案 0 :(得分:0)

panel.ClipToBounds = true时,剪切区域受到网格边界的限制。但是,当您将其设置为“false”时,内容可能会以负边距显示在面板的左侧或右侧。因此窗口的整个宽度被视为剪辑矩形。由于网格位于窗口中间并且距离左边缘偏离-20,因此矩形的宽度为:

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

其中3是窗口边框的大小。