Wpf SnapsToDevicePixels问题
在我的WPF应用程序中,我创建了一些线条元素并添加到StackPanel中。所有线的厚度都设置为0.5。但当我渲染它时,有时很少有线条出现模糊。我尝试在StackPanel中设置SnapsToDevicePixels,但这会使线条完全不可见。现在,如果我将线厚度增加到1或大于1,那么SnapsToDevicePixels工作正常 我正在创建一行,如下所示:Wpf SnapsToDevicePixels问题,wpf,Wpf,在我的WPF应用程序中,我创建了一些线条元素并添加到StackPanel中。所有线的厚度都设置为0.5。但当我渲染它时,有时很少有线条出现模糊。我尝试在StackPanel中设置SnapsToDevicePixels,但这会使线条完全不可见。现在,如果我将线厚度增加到1或大于1,那么SnapsToDevicePixels工作正常 我正在创建一行,如下所示: private void CreateLine(Double y1, Double y2, Double x1, Double x2, Do
private void CreateLine(Double y1, Double y2, Double x1, Double x2, Double width, Double height)
{
Line line = new Line() { Y1 = y1, Y2 = y2, X1 = x1, X2 = x2, Width = width, Height = height };
}
这里,如果线宽设置为0.5,x1和x2值将为0.25(线宽/2),宽度为0.5(线宽)
要使SnapsToDevicePixels在WPF中工作,是否需要设置任何最小像素值?我通过使用
UseLayoutRounding
解决了我的许多SnapToDevicePixels
问题:
就你而言:
<StackPanel UseLayoutRounding="True">
...
</StackPanel>
...
我不知道这是否能解决您的问题,但根据我的经验,值得一试 不,本质上没有最小值。您遇到的模糊是由于WPf通常处理图形的方式造成的。根据我的经验,你对此无能为力。可能会有一些缓刑,但仍可能无法预测 此外,像素和WPF单元之间存在差异,这使得事情更加复杂,尽管存在许多技术在它们之间进行转换 将像素转换为WPF单元的常用方法是:
Matrix m = PresentationSource.FromVisual(this).CompositionTarget.TransformToDevice;
double dpiFactor = 1/m.M11;
double lineThickness = dpiFactor * 1; // Repace '1' with desired pixel size.
以下是一篇关于该主题的有用文章:
不建议设置分数位置 WPF分数的一半是什么意思? WPF将1点解释为1/96英寸。不同显示器(96 DPI、300 DPI)的像素不同 WPF将1点视为96 DPI普通监视器中的1像素。及 效果很好。它尝试将0.5像素捕捉到监视器网格。有两种结果:放大版二个一像素或缩短版为0像素(消失) 如果出于某种原因需要精确的1像素(不是1点)定位,则使用
对于.NET4或更高版本,最好使用。它在UI位置测量级别计算像素偏移。而
SnapsToDevicePixels
在渲染级别工作。布局舍入的缺点是不利于动态移动。UseLayoutRounding在.Net 3.5中不存在。我有一个自定义控件,它的目标是.NET3.5和4.0。所以我必须使用SnapsToDevicePixels。你能告诉我为什么SnapsToDevicePixels在线宽(像素值)小于1的情况下不能正常工作吗?也许是四舍五入到了零?尝试使用0.51(是否有理由不使用1.0?)没有任何变化。SnapsToDevicePixels仅在像素值大于或等于1时工作。我尝试进行上述计算,但仍然没有更改。像素值0.5与SnapsToDevicePixels一起工作不正常。有时行正在消失。我已经编辑了我的问题并提供了创建行的代码。您是如何确定x1/x2将等于0.25的?根据你的代码,它可以是任何东西。对于垂直线,我只是将x1和x2的值设置为LineThickness/2。因此,如果线宽为0.5,x1和x2将为0.25。此外,线宽设置为线宽值。我做错什么了吗?我想创建一条具有定义线宽的垂直线。对于初学者,我会避免设置“宽度”和“高度”。您所做的另一个错误是在问题中没有提供完整的代码。