.net WPF像素线模糊

oknwwptz  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(123)

我正在创建一个包含直线的按钮样式:

<Button VerticalAlignment="Center" HorizontalAlignment="Center">
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Setter Property="Background" Value="#F0F0F0"/>
                <Setter Property="Width" Value="50"/>
                <Setter Property="Height" Value="50"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Button}">
                            <Grid Background="{TemplateBinding Background}">
                                <Path Stroke="Black" StrokeThickness="1" Data="M0,0 L10,0" 
                                      VerticalAlignment="Center" HorizontalAlignment="Center"
                                      SnapsToDevicePixels="True" UseLayoutRounding="True"/>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Button.Style>
    </Button>

但我总是得到一条2 px宽的线,而不是1 px宽的线:

我尝试使用下面的(与父GridPath元素本身相关):UseLayoutRounding="True"SnapsToDevicePixels="True"RenderOptions.BitmapScalingMode="Fant"RenderOptions.EdgeMode="Aliased"。这一切都没有帮助我,并没有使线看起来正常。以前,上述之一或它们的组合总是有帮助的。

我尝试确定窗口的系统DPI值和WPF知道的值:

PresentationSource presentationSource = PresentationSource.FromVisual(window);                 
double wpfDpi = 96.0 * presentationSource.CompositionTarget.TransformToDevice.M11;                 
double currentDpi = GetDpiForWindow(hWnd);

两个值相同(120)-应用程序知道刻度。
Taget平台:NET Framework 4.5
操作系统:Windows 10

sqserrrh

sqserrrh1#

RenderOptions.EdgeMode="Aliased"添加到Path对象。
这将迫使一个1像素宽的线到精确的像素边界,给你一个清晰的图形。
你不需要UseLayoutRoundingSnapsToDevicePixels

<Path Stroke="Black" 
      StrokeThickness="1" 
      Data="M0,0 L10,0" 
      VerticalAlignment="Center" 
      HorizontalAlignment="Center"                                      
      RenderOptions.EdgeMode="Aliased" />

相关问题