SnapsToDevicePixels定位工件。 [英] SnapsToDevicePixels position artifacts.
本文介绍了SnapsToDevicePixels定位工件。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我绘制线条,一些线条跳过像素,让它们变空。
当我想创建单元格时,这是一个严重的问题。
我的目标是画一个网格。
如何解决问题?
屏幕截图 [ ^ ]
I draw lines and some lines skip pixels leaving them empty.
It is a serious problem when i wanna create cells.
My goal is to draw a grid.
How to solve the problem?
Screenshot[^]
<Canvas Background="Black" RenderOptions.EdgeMode="Aliased" SnapsToDevicePixels="True">
<Line X1='30' Y1='30' X2='100' Y2='30' Stroke="White"/>
<Line X1='30' Y1='31' X2='100' Y2='31' Stroke="White"/>
<Line X1='30' Y1='32' X2='100' Y2='32' Stroke="White"/>
<Line X1='30' Y1='33' X2='100' Y2='33' Stroke="White"/>
<Line X1='30' Y1='34' X2='100' Y2='34' Stroke="White"/>
<Line X1='30' Y1='35' X2='100' Y2='35' Stroke="White"/>
<Line X1='30' Y1='36' X2='100' Y2='36' Stroke="White"/>
<Line X1='30' Y1='37' X2='100' Y2='37' Stroke="White"/>
<Line X1='30' Y1='38' X2='100' Y2='38' Stroke="White"/>
</Canvas>
下一个代码尝试绘制一个网格,但由于DPI导致网格之间的距离不同,网格变得混乱独立性:
截图 [ ^ ]
The next code tries to draw a grid, but the grid comes to be messed as distances between lines differ due to DPI independence:
Screenshot[^]
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Loaded += MainWindow_Loaded;
}
Canvas canvas;
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
canvas = new Canvas();
canvas.Background = Brushes.Black;
this.Content = canvas;
RenderOptions.SetEdgeMode(canvas, EdgeMode.Aliased);
canvas.SnapsToDevicePixels = true;
Shape();
}
double i = 0;
private void Shape()
{
canvas.Children.Clear();
for (double i = 0; i < 20; i += 2)
{
Line line = new Line();
line.X1 = 30;
line.Y1 = 30 + i;
line.X2 = 100;
line.Y2 = 30 + i;
line.Stroke = Brushes.White;
line.StrokeThickness = 1;
canvas.Children.Add(line);
}
}
}
推荐答案
下一个代码解决使形状以物理屏幕像素绘制的问题:
The next code solves the problem making shapes to be drawn in physical screen pixels:
canvas.RenderTransform = new MatrixTransform(
PresentationSource.FromVisual(this).CompositionTarget.TransformFromDevice);
我在问题中写的代码的固定版本:
The fixed version of the code i wrote in the question:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Loaded += MainWindow_Loaded;
}
Canvas canvas;
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
canvas = new Canvas();
canvas.Background = Brushes.Black;
this.Content = canvas;
RenderOptions.SetEdgeMode(canvas, EdgeMode.Aliased);
canvas.SnapsToDevicePixels = true;
canvas.RenderTransform = new MatrixTransform(
PresentationSource.FromVisual(this).CompositionTarget.TransformFromDevice);
Shape();
}
double i = 0;
private void Shape()
{
canvas.Children.Clear();
for (double i = 0; i < 20; i += 2)
{
Line line = new Line();
line.X1 = 30;
line.Y1 = 30 + i;
line.X2 = 100;
line.Y2 = 30 + i;
line.Stroke = Brushes.White;
line.StrokeThickness = 1;
canvas.Children.Add(line);
}
}
}
这篇关于SnapsToDevicePixels定位工件。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文