为什么边框在调整网格大小时停止呈现其负边距

Why does the border stop rendering its minus margin while resizing the grid

我使用带负边距的边框来标记网格行。但是在调整 window 大小时出现奇怪的行为。剪切该行的第二列使边框的边距消失:

当然这是一个小例子,在主应用程序中我使用了网格分离器,但行为保持不变。是否有可能以某种方式解决这个问题,或者这是一个 WPF 错误?

MainWindow.xaml:

<Window x:Class="TestHighlightBorder.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:TestHighlightBorder"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">

<Grid Margin="100,0,0,0" >

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200" />
        <ColumnDefinition Width="10" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>
        <RowDefinition Height="40" />
    </Grid.RowDefinitions>

    <Border Background="DarkRed" Opacity="0.3" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" Margin="-80,0,0,0" Panel.ZIndex="1" />
    <TextBlock Text="column 0" Background="LightBlue" Grid.Row="0" Grid.Column="0" />
    <TextBlock Text="column 2" Background="LightGreen" Grid.Row="0" Grid.Column="2" />

</Grid>

ps: 这就是主应用程序的样子。这是某种属性网格。负边距的数量取决于嵌套对象的级别。

除了在网格中添加 100 的左边距外,您还可以在开头固定一个宽度为 100 的列,将边框的列跨度设置为 4,将负边距替换为 20 正左边距 (100-80=20),并为每个控件将 Grid.Column 的值加 1。所以最终的方法看起来像这样:

<Grid>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100" />
        <ColumnDefinition Width="200" />
        <ColumnDefinition Width="10" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>
        <RowDefinition Height="40" />
    </Grid.RowDefinitions>

    <Border Background="DarkRed" Opacity="0.3" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="4" Margin="20,0,0,0" Panel.ZIndex="1" />
    <TextBlock Text="column 0" Background="LightBlue" Grid.Row="0" Grid.Column="1" />
    <TextBlock Text="column 2" Background="LightGreen" Grid.Row="0" Grid.Column="3" />

</Grid>

我试过你的例子,结果就像你说的那样:第 2 列不见了,边距不见了。
每当网格无法完全显示时,似乎都会发生这种情况。
例如,如果您将第三列定义设置为 200,则只要第 2 列未完整显示,边距就会消失。当您从底部调整 window 的大小时,也会发生同样的事情。

如果您将现有网格放在另一个容器(Grid、StackPanel 等)中并将 MinWidth 设置为至少等于列宽 + 边距的大小(在您的示例中为 310),则不会不会发生。

像这样:

<StackPanel MinWidth="310">
    <Grid Margin="100,0,0,0" >

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="200" />
            <ColumnDefinition Width="10" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="40" />
        </Grid.RowDefinitions>

        <Border Background="DarkRed" Opacity="0.3" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" Margin="-80,0,0,0" Panel.ZIndex="1" />
        <TextBlock Text="column 0" Background="LightBlue" Grid.Row="0" Grid.Column="0" />
        <TextBlock Text="column 2" Background="LightGreen" Grid.Row="0" Grid.Column="2" />

    </Grid>
</StackPanel>