Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在调整网格大小时边框停止渲染其负边距_C#_Wpf_Xaml_Grid_Border - Fatal编程技术网

C# 为什么在调整网格大小时边框停止渲染其负边距

C# 为什么在调整网格大小时边框停止渲染其负边距,c#,wpf,xaml,grid,border,C#,Wpf,Xaml,Grid,Border,我用了一个带负边距的边框来标记一个网格行。但我在调整窗口大小时有一种奇怪的行为。剪切行的第二列会使边框的边距消失: 当然这是一个小例子,在主应用程序中我使用了网格拆分器,但bahaviour保持不变。是否有可能以某种方式修复此问题,或者它是WPF错误 MainWindow.xaml: <Window x:Class="TestHighlightBorder.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xam

我用了一个带负边距的边框来标记一个网格行。但我在调整窗口大小时有一种奇怪的行为。剪切行的第二列会使边框的边距消失:

当然这是一个小例子,在主应用程序中我使用了网格拆分器,但bahaviour保持不变。是否有可能以某种方式修复此问题,或者它是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>

附言: 这就是主应用程序的外观。这是一种不动产网格。负边距的大小取决于嵌套对象的级别。

不必在网格中添加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列未完整显示时,边距将立即消失。从底部调整窗口大小时也会发生同样的情况

如果将现有网格放在另一个容器(网格、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>


为什么不从边框中删除负边距,并在
文本块前面使用正边距呢?作为一种修复方法,我假设删除边距,只需在
网格中添加两列(20和80),并将边框从第二列开始就可以了。但是出于兴趣,您能测试一下如果给边框一个
ColumnSpan
2
,会发生什么情况吗?在主应用程序中,我使用了多个嵌套行,它们是动态生成的,因此边距也变了。tl;博士,我需要底片边缘