为什么边界边界和边界背景在wpf之间存在差距?

时间:2017-04-03 17:22:40

标签: wpf

以下代码:

<Window x:Class="WpfApp1.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"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Border Background="Red">
            <Border BorderThickness="10" BorderBrush="Black" Background="Black"/>
        </Border>
    </Grid>
</Window>

生成以下输出(.NET 4.6.1,Windows 10):

enter image description here

红线不应该在那里。这似乎是第二个边界与第二个边界背景之间的差距。我尝试将SnapsToDevicePixels设置为True,但不会更改。

更新

正如答案所示,RenderOptions.EdgeMode="Aliased"似乎解决了这个问题。但实际上我认为它更能突出WPF中的一个错误。因为现在,以下代码:

<Window x:Class="WpfApp1.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"
        mc:Ignorable="d"
        RenderOptions.EdgeMode="Aliased"
        SnapsToDevicePixels="True"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Border Background="Red">
            <Border Margin="10" BorderThickness="1" BorderBrush="Black">
                <Grid Background="Black"/>
            </Border>
        </Border>
    </Grid>
</Window>

产生以下输出: enter image description here

1 个答案:

答案 0 :(得分:0)

可能是因为设计师使用快速算法来渲染视图,并且在运行可执行文件时使用高质量的算法。

设置RenderOptions.EdgeMode =“Aliased”似乎迫使设计师高质量地画画。

<Window.RenderTransform>
    <ScaleTransform ScaleX="1.5" ScaleY="1.5"/>
</Window.RenderTransform>
<Grid RenderOptions.EdgeMode="Aliased">
    <Border Background="Red">
        <Border BorderThickness="10" BorderBrush="Black" Background="Black"/>
    </Border>
</Grid>

回答问题的第二部分:

这是因为您的窗口没有捕捉到屏幕,只有内容被削弱到设备像素。如果窗口的位置被捕捉到屏幕,它将起作用。向左/向右滚动/向左滚动,您会发现它有时会正确地卡入。我认为这是一个设计问题,在完成MeasureOverride和ArrangeOverride周期后,在后处理周期完成捕捉,而不是在父调用和子调用之间进行捕捉。如果它应捕捉容器边框并将相应的可用空间发送到度量覆盖中的网格。然后,WPF将支持正确地捕捉部分布局。