2015-03-28 17 views
5

Onun merkezinde bir kırmızı çarpı çizen bir denetim yapmaya çalışıyorum. Çaprazların bir piksel genişliğinde olmasını istiyorum ve antialiasing'i devre dışı bırakmak ve ekranın piksellerine yapışmak istiyorum.WPF bir piksel geniş çizgi bazen kayboluyor

Denetim çalışır, ancak bir ayırıcı içeren bir Izgara içine eklerseniz, ayırıcıyı sürüklediğimde satırlardan biri bazen kaybolur. Yatay bir ayırıcı ile bir ızgara içine koyarsam, yatay çizgi bazen kaybolur ve dikey ayırıcı ile bir ızgara içine koyarsam, dikey çizgi bazen kaybolur.

Çizgiler kaybolmasını nasıl durdurabilirim? İşte

xaml kodu:

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

Ve burada HalfValueConverter kodudur:

:

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); 
     } 
    } 
} 

Bu, doğru pozisyona splitter sürüklerken nasıl görünüyor

Line gone

Ve bu nasıl o görünmelidir:

Line visible

+3

"SnapsToDevicePixels" işlevine ek olarak UseLayoutRounding = "True" işlevini denediniz mi? – gomi42

+0

Bu işe yaradı, teşekkürler. Bunu bir cevap olarak yazarsanız memnuniyetle kabul ederim. – Ove

cevap

2

Ben de SnapsToDevicePixels ilaveten UseLayoutRounding="True" kullanmak için gerekli kaybolan gelen çizgileri durdurmak için.

+0

Ne? Neden biliyor musun? –

+0

ViewBox'ın küçültülürken çizgiyi kaybettiğini görüyorum. https://stackoverflow.com/q/44495238/6116637 Kullanılamamak için 'UseLayoutRounding = "True" 'değerini kullanamıyorum. – lindexi