在我的WPF应用程序中,我创建了几个Line元素并添加到StackPanel中。所有线条的厚度均设为0.5。但是当我渲染它时,有时候几条线条看起来很模糊。我尝试在StackPanel中设置SnapsToDevicePixels,但这会使线条完全不可见。现在,如果我将线条粗细增加到1或大于1,那么SnapsToDevicePixels正常工作。
我正在创建Line,如下所示:
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 };
}
这里,如果LineThickness设置为0.5,则x1和x2值将为0.25(LineThickenss / 2),宽度为0.5(LineThickness)。
为了使SnapsToDevicePixels在WPF中工作,是否需要设置任何最小像素值?
答案 0 :(得分:4)
我使用SnapToDevicePixels
来解决我的许多UseLayoutRounding
问题:
在你的情况下:
<StackPanel UseLayoutRounding="True">
...
</StackPanel>
我不知道这是否会解决您的问题,但根据我的经验,值得一试!
答案 1 :(得分:1)
不,本身没有最低限度。您遇到的模糊是由于WPf如何处理绘图。根据我的经验,你无法真正做任何事情。 Snapping to device pixels可能会有一些缓解,但仍然无法预测。
像素和WPF单元之间也存在差异,使事情变得更复杂,尽管有许多技术可以在它们之间进行转换。
将像素转换为WPF单元的常用方法是:
Matrix m = PresentationSource.FromVisual(this).CompositionTarget.TransformToDevice;
double dpiFactor = 1/m.M11;
double lineThickness = dpiFactor * 1; // Repace '1' with desired pixel size.
以下是有关该主题的有用文章: http://www.wpftutorial.net/DrawOnPhysicalDevicePixels.html
答案 2 :(得分:1)
不建议设置小数位置。
什么意味着WPF的一半点? WPF将1点解释为1/96英寸。不同的显示器(96 DPI,300 DPI)的像素不同。
WPF将普通显示器中的1点视为1像素,96 DPI。和 UIElement.SnapsToDevicePixels效果很好。它尝试将0.5像素捕捉到监视器网格。有两个结果:放大版本2一个像素或缩短版本到0像素(消失)。
如果由于某种原因需要精确的1个像素(而非1个点)定位,请使用GuidelineSet。
使用.NET 4或更高版本时,最好使用Layout Rounding。它在UI位置测量级别计算像素偏移。虽然SnapsToDevicePixels
适用于渲染级别。 Layout Rounding
的减号是动态移动不好。