WPF one pixel line sometimes disappears

I am trying to make a control that draws a red cross in its center. I want the cross to be one pixel wide, and I want to turn off anti-aliasing and make it snap to screen pixels.

The control works, but if I add it inside the grid, which has a splitter, when I drag the separator, one of the lines sometimes disappears. If I put it inside a grid with a horizontal splitter, the horizontal line will sometimes disappear, and if I put it inside a grid with a vertical splitter, the vertical line will sometimes disappear.

How can I stop the lines from disappearing?

Here is the 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> 

And here is the code for 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); } } } 

It looks like this when you drag the splitter to the desired position:

Line gone

And this is how it should look:

Line visible

+5
source share
1 answer

To stop the lines from disappearing, I also had to use UseLayoutRounding="True" in addition to SnapsToDevicePixels .

+2
source

Source: https://habr.com/ru/post/1216354/


All Articles