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:
Und das ist wie es sollte aussehen:
Haben Sie 'UseLayoutRounding =" True "zusätzlich zu' SnapsToDevicePixels' versucht? – gomi42
Das hat funktioniert, danke. Wenn Sie dies als Antwort schreiben, werde ich es gerne annehmen. – Ove