调整窗口大小时,带有负边距的边框会消失

时间:2016-11-11 16:10:46

标签: c# wpf layout

我在网格中有一个网格和两个边框元素。当我使窗口变小时,外边框消失。有谁知道为什么以及如何防止它消失? 这是主窗口的布局:

<Window x:Class="TestBorder.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TestBorder"
        mc:Ignorable="d"
        Title="MainWindow" Height="170" Width="225">
    <Grid Margin="5" Height="100" VerticalAlignment="Top">
        <Border BorderBrush="LightBlue" BorderThickness="5" Margin="-5"/>
        <Border BorderBrush="Orange" BorderThickness="5"/>
    </Grid>
</Window>

以下是我调整大小时会发生的事情:

enter image description here

如果我缩小窗口,则外部(蓝色)边框不可见。我知道有可能解决它,但我想知道为什么会这样。

2 个答案:

答案 0 :(得分:1)

这是因为Grid元素在无法以完整大小显示内容时剪切内容。尽管除非设置了ClipToBounds,否则UIElement基类不会进行任何裁剪,中间FrameworkElement类会覆盖此行为,并在内容不适合该区域时剪切内容。剪贴蒙版的几何图形由GetLayoutClip()方法确定。从剪裁区域中减去边距,结果外边框消失。

来自FrameworkElement.GetLayoutClip()上的MSDN:

  

返回剪贴蒙版的几何体。如果布局,则应用蒙版   系统试图安排一个大于的元素   可用的展示空间。

     

备注:作为布局的一部分,将从layoutSlotSize中减去边距   系统行为。

     

返回的空引用表示不会发生剪切。该   当ClipToBounds为false时,默认实现始终返回null。   此方法重写UIElement.GetLayoutClip。 FrameworkElement   实现在其计算中使用MaxHeight和MaxWidth。   FrameworkElement的几个子类再次覆盖此方法。

可以使用根本不进行任何裁剪的网格(取自answer):

public class MyGrid : Grid 
{
    protected override Geometry GetLayoutClip(Size layoutSlotSize) 
    {
        return null;
    }
}

答案 1 :(得分:0)

您正在网格上设置高度,它将始终具有相同的大小(如果您调整主窗口的大小,则无关紧要)。如果您希望边框占据所有窗口并使用它调整大小,请删除网格上的高度。