Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf SnapsToDevicePixels问题_Wpf - Fatal编程技术网

Wpf 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

在我的WPF应用程序中,我创建了一些线条元素并添加到StackPanel中。所有线的厚度都设置为0.5。但当我渲染它时,有时很少有线条出现模糊。我尝试在StackPanel中设置SnapsToDevicePixels,但这会使线条完全不可见。现在,如果我将线厚度增加到1或大于1,那么SnapsToDevicePixels工作正常

我正在创建一行,如下所示:

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。此外,线宽设置为线宽值。我做错什么了吗?我想创建一条具有定义线宽的垂直线。对于初学者,我会避免设置“宽度”和“高度”。您所做的另一个错误是在问题中没有提供完整的代码。