【问题标题】:WPF one pixel-wide line sometimes disappearsWPF 一个像素宽的线有时会消失
【发布时间】:2015-06-26 16:56:42
【问题描述】:

我正在尝试制作一个在其中心绘制一个红十字的控件。我希望十字宽为 1 个像素,并且我想禁用抗锯齿并使其与屏幕像素对齐。

该控件有效,但如果我将它添加到具有拆分器的网格中,当我拖动拆分器时,其中一条线有时会消失。如果我把它放在带有水平分隔线的网格中,水平线有时会消失,如果我把它放在带有垂直分隔线的网格中,垂直线有时会消失。

如何防止线条消失?

这里是 xaml 代码:

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

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

这是将拆分器拖到正确位置时的样子:

它应该是这样的:

【问题讨论】:

  • 除了SnapsToDevicePixels之外,您是否尝试过UseLayoutRounding="True"?
  • 这行得通,谢谢。如果您将其写为答案,我将很乐意接受。

标签: c# wpf


【解决方案1】:

为了防止线条消失,除了SnapsToDevicePixels,我还需要使用UseLayoutRounding="True"。

【讨论】:

  • 什么?你知道为什么吗?
  • 我看到 ViewBox 在放大到小时会丢失线条。 stackoverflow.com/q/44495238/6116637 我无法使用设置 UseLayoutRounding="True" 来显示它。
猜你喜欢
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
相关资源
最近更新 更多