据我了解,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?
答案 0 :(得分:0)
当panel.ClipToBounds = true
时,剪切区域受到网格边界的限制。但是,当您将其设置为“false”时,内容可能会以负边距显示在面板的左侧或右侧。因此窗口的整个宽度被视为剪辑矩形。由于网格位于窗口中间并且距离左边缘偏离-20,因此矩形的宽度为:
width = 216 - 20 - 3 - 3 = 190.
其中3是窗口边框的大小。