2017-04-03 15 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

赤いラインがあってはなりません。それは、第2ボーダーのボーダーと第2ボーダーの背景との間のギャップのようです。 SnapsToDevicePixelsTrueに設定しようとしましたが、変更されません。

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を使用していますので、OSがビジュアルをどのように扱うかについては、私はそのフィールドを無視しています – Tuco

答えて

0

設計者はビューをレンダリングするために高速なアルゴリズムを使用して実行可能ファイルを実行するときに、高品質のものが使用されているのでそれはあるかもしれません。

RenderOptions.EdgeMode = "Aliased"を設定すると、デザイナーが高品質で描画するように設定されているようです。あなたのウィンドウが唯一のコンテンツはデバイスピクセルにsappedされる画面にスナップされていないため、

それは次のとおりです。

<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は、レイアウトの一部のスナップを適切にサポートします。

関連する問題