我绘制线条,一些线条跳过像素,让它们变空。 当我想创建单元格时,这是一个严重的问题。 我的目标是画一个网格。 如何解决问题? 屏幕截图 [ ^ ]
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); } } }Codeproject滞后。 来源 [ ^ ]。
更多推荐
SnapsToDevicePixels定位工件。
发布评论