2015-03-28 8 views
5

Ich versuche ein Steuerelement zu machen, das ein rotes Kreuz in seiner Mitte zeichnet. Ich möchte, dass das Kreuz ein Pixel breit ist, und ich möchte das Antialiasing deaktivieren und es auf die Pixel des Bildschirms ausrichten lassen.WPF eine ein Pixel breite Linie verschwindet manchmal

Die Kontrolle funktioniert, aber wenn ich es innerhalb eines Gitters, das einen Splitter hat, hinzufüge, wenn ich den Splitter ziehe, verschwindet manchmal eine der Linien. Wenn ich es in ein Gitter mit einem horizontalen Teiler lege, verschwindet die horizontale Linie manchmal und wenn ich es in ein Gitter mit einem vertikalen Teiler lege, verschwindet die vertikale Linie manchmal.

Wie kann ich verhindern, dass die Zeilen verschwinden? Hier

ist der XAML-Code:

<Window x:Class="WpfTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfTest" 
     Title="MainWindow" Height="600" Width="800"> 
    <Window.Resources> 
     <local:HalfValueConverter x:Key="halfConv" /> 

     <Style TargetType="Line"> 
      <Setter Property="Stroke" Value="Red"/> 
      <Setter Property="StrokeThickness" Value="1"/> 
      <Setter Property="RenderOptions.EdgeMode" Value="Aliased"/> 
      <Setter Property="SnapsToDevicePixels" Value="True" /> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <Grid Grid.Row="2" Background="Black" Name="grdParent"> 
      <Line X1="{Binding ActualWidth, ElementName=grdParent, Converter={StaticResource halfConv}}" 
       Y1="0" 
       X2="{Binding ActualWidth, ElementName=grdParent, Converter={StaticResource halfConv}}" 
       Y2="{Binding ActualHeight, RelativeSource={x:Static RelativeSource.Self}}" 
       Height="100" 
       /> 
      <Line X1="0" 
       Y1="{Binding ActualHeight, ElementName=grdParent, Converter={StaticResource halfConv}}" 
       X2="{Binding ActualWidth, RelativeSource={x:Static RelativeSource.Self}}" 
       Y2="{Binding ActualHeight, ElementName=grdParent, Converter={StaticResource halfConv}}" 
       Width="100" 
       /> 
     </Grid> 
     <GridSplitter Grid.Row="1" Height="5" HorizontalAlignment="Stretch" Background="Gray" ResizeBehavior="PreviousAndNext" ResizeDirection="Rows" /> 
    </Grid> 
</Window> 

Und hier ist der Code für die HalfValueConverter:

using System; 
using System.Windows.Data; 

namespace WpfTest 
{ 
    public class HalfValueConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      return ((double)value/2); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      return ((double)value * 2); 
     } 
    } 
} 

Dies ist, wie es aussieht, wenn Sie den Splitter in die richtige Position ziehen:

Line gone

Und das ist wie es sollte aussehen:

Line visible

+3

Haben Sie 'UseLayoutRounding =" True "zusätzlich zu' SnapsToDevicePixels' versucht? – gomi42

+0

Das hat funktioniert, danke. Wenn Sie dies als Antwort schreiben, werde ich es gerne annehmen. – Ove

Antwort

2

Um die Linien verschwinden zu stoppen ich brauchte auch UseLayoutRounding="True" zusätzlich zu SnapsToDevicePixels verwenden.

+0

Was zum? Weißt du, warum? –

+0

Ich sehe, die ViewBox wird die Linie verloren, wenn auf klein gezoomt. https://stackoverflow.com/q/44495238/6116637 Ich kann nicht verwenden, setzen Sie die 'UseLayoutRounding =" True "' um es zu zeigen. – lindexi