gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:47 25 4
gpt4 key购买 nike

我重写了 Border 控件,在我重写的 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。

作为引用,这是我的 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>

最佳答案

请记住 (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 使您的线条向左对齐半个像素。


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

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));

关于c# - 为什么我的坐标 (1,1) 从 (0, 1) 开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23482618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com