2017-04-03 323 views
2

以下代碼:爲什麼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,但它不會更改。

UPDATE

正如答案建議,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

我在WPF項目中複製了你的代碼,並沒有得到那條紅線,你可能有其他的東西改變你的視覺效果。我想你沒有包括所有的代碼來簡化問題。 – Tuco

+1

我將其複製到VS2015中的一個全新項目中,並顯示在那裏。編輯:只有設計模式,當我運行它沒有紅色。 –

+1

你正在使用W10,我想@AdamSills也是,我使用的是W7,所以它與操作系統如何處理視覺相關,我對該領域無知 – Tuco

回答

0

這可能是因爲設計師採用快速算法渲染視圖和運行可執行文件時,高品質的一個被使用。

設置RenderOptions.EdgeMode =「別名」似乎強制設計師繪製高品質。

<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將支持正確地捕捉部分佈局。