为什么我的坐标(1,1)从(0,1)开始?

时间:2014-05-05 22:00:35

标签: c# wpf drawing line render

我覆盖了边框控件,在我的重写OnRender中我做了:

protected override void OnRender(System.Windows.Media.DrawingContext dc)
        {
            this.SnapsToDevicePixels = true;
            this.VisualEdgeMode = EdgeMode.Aliased;
            var myPen = new Pen(new SolidColorBrush(Colors.LightGray), 1);
            dc.DrawLine(myPen, new Point(1, 1), new Point(1, RenderSize.Height - 1));
            return;

哪个给我这个结果: enter image description here

问题:

是否有人可以告诉我为什么我的代码从(0,1)开始绘制一条线,而假设从(1,1)开始,就像用代码写的一样?

我的DPI是96,96。

对于ref,这是我的xaml:

<Window xmlns:MyControls="clr-namespace:MyControls;assembly=MyControls"  x:Class="TestControls.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>


        <MyControls:Border3D BorderThickness="3" BorderBrush="Aqua">
            <Rectangle Width="74" Height="3" HorizontalAlignment="Left">
                <Rectangle.Fill>
                    <SolidColorBrush Color="#40FF0000">

                    </SolidColorBrush>
                </Rectangle.Fill>
            </Rectangle>
        </MyControls:Border3D>

        <Rectangle  Grid.Row="1" Grid.Column="0" Width="80" Grid.ColumnSpan="2" HorizontalAlignment="Left">
            <Rectangle.Fill>
                <SolidColorBrush Color="LightGray"></SolidColorBrush>
            </Rectangle.Fill>
        </Rectangle>

    </Grid>
</Window>

1 个答案:

答案 0 :(得分:2)

请注意,(0, 0)不是左上角像素的中心。相反,它是该像素的左上角。为了在第二个像素列(索引为1)的中间绘制行程厚度为1的行,您必须从(1.5, 1)绘制到(1.5, RenderSize.Height - 1)

dc.DrawLine(myPen, new Point(1.5, 1), new Point(1.5, RenderSize.Height - 1));

设置SnapsToDevicePixels = true使您的线条向左捕捉半个像素。


如果您对线条笔的StartLineCapEndLineCap属性使用PenLineCap.Square,则可以从一个像素中心到另一个像素中心进行绘制:

var myPen = new Pen(Brushes.LightGray, 1);
myPen.StartLineCap = PenLineCap.Square;
myPen.EndLineCap = PenLineCap.Square;
dc.DrawLine(myPen, new Point(1.5, 1.5), new Point(1.5, RenderSize.Height - 1.5));