SnapsToDevicePixels定位工件。 [英] SnapsToDevicePixels position artifacts.

查看:69
本文介绍了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);
            }
        }
    }





Codeproject滞后。



来源 [ ^ ]。


这篇关于SnapsToDevicePixels定位工件。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆