2017-04-03 13 views
2

Der folgende Code:Warum gibt es eine Lücke zwischen der Grenze und dem Hintergrund der Grenze in 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> 

erzeugt die folgende Ausgabe (.NET 4.6.1 Windows 10):

enter image description here

Die rote Linie sollte nicht da sein. Es scheint eine Lücke zwischen der Grenze der zweiten Grenze und dem Hintergrund der zweiten Grenze zu sein. Ich habe versucht, SnapsToDevicePixels auf True zu setzen, aber es ändert sich nicht.

UPDATE

Wie in den Antworten vorgeschlagen, scheint RenderOptions.EdgeMode="Aliased" um das Problem zu lösen. Aber in der Tat denke ich, es ist besser, einen Bug in WPF hervorzuheben. Da nun der folgende Code:

<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> 

erzeugt die folgende Ausgabe: enter image description here

+1

Ich habe Ihren Code in ein WPF-Projekt kopiert, und ich habe diese rote Linie nicht erhalten, Sie könnten etwas anderes haben, das Ihre Grafik verändert. Ich nehme an, Sie haben nicht den ganzen Code hinzugefügt, um die Frage zu vereinfachen. – Tuco

+1

Ich habe in ein brandneues Projekt in VS2015 kopiert und es zeigt sich dort. Edit: Design-Modus nur, wenn ich es ausführen gibt es keine rote. –

+1

Sie verwenden W10, ich nehme auch @AdamSills an, ich benutze W7, also hängt es davon ab, wie das OS die Visuals behandelt, ich bin ein Ignorant auf diesem Feld – Tuco

Antwort

0

Es könnte sein, weil der Designer einen schnellen Algorithmus verwendet die Ansicht zu machen und wenn die ausführbare Datei eines hohen Qualitätsanspruch eines ausgeführt wird verwendet .

Einstellung RenderOptions.EdgeMode = "Aliased" scheint den Designer zu zwingen, in hoher Qualität zu zeichnen.

<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> 

Um den zweiten Teil Ihrer Frage zu beantworten:

Es ist, weil das Fenster nicht nur auf den Bildschirm aufgeschnappt wird der Inhalt auf Gerätepixel aufgezehrt wird. Es würde funktionieren, wenn die Position des Fensters auf dem Bildschirm gefangen wäre. Scrolle/bewege es nach links und rechts und du wirst sehen, dass es manchmal richtig einrastet. Ich denke, es ist ein Design-Problem, bei dem das Einrasten in einem Nachbearbeitungszyklus erfolgt, nachdem die MeasureOverride- und ArrangeOverride-Zyklen abgeschlossen sind, anstatt zwischen den Eltern- und Kindaufrufen einzufallen. Wenn es den Container-Rahmen einrasten und den richtigen verfügbaren Speicherplatz an das Raster in der Measure-Überschreibung senden soll. WPF würde dann das korrekte Einrasten von Teilen des Layouts unterstützen.

Verwandte Themen