我有一个Border
(内部包含Canvas
),如下所示,我希望在Canvas
上移动时动态显示鼠标的位置:
.xmal
:
<Border x:Name="cwgLayoutDesignBorder" BorderThickness="0"
Width="600" Height="800" BorderBrush="Yellow">
<ItemsControl x:Name="linecontrol">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Background="Green" MouseMove="Canvas_MouseMove"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Canvas>
...
</Canvas>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
.cs
:
private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
Point p = e.GetPosition(linecontrol);
this.Title = "(" + Convert.ToInt32(p.X) + ", " + Convert.ToInt32(p.Y) + ")";
}
我发现鼠标返回的位置为x
中的[0, 600]
和y
中的[1, 800]
。但是,根据我的定义,我认为结果应该是[0, 599]
而y
代替[0, 799]
。为什么他们不一致?或者我该如何获得正确的鼠标位置?
答案 0 :(得分:2)
x[0,599]
和y[0,799]
。如果您尝试在0,0
处绘制一个像素,它将是左上角的像素,如果您在600,800
处绘制,它将在“画布”之外绘制。绘制一个简单的50x50画布并对其进行操作以查看:
for (int x = 0; x < 51; x++)
{
for (int y = 0; y < 51; y++)
{
var rect = new Rectangle
{
Stroke = Brushes.White,
StrokeThickness = 1,
Width=1,
Height=1
};
if (x == 0 & y == 0)
{
rect.Stroke = Brushes.LimeGreen;
}
if (x == 50 & y == 50)
{
rect.Stroke = Brushes.LimeGreen;
}
Canvas.SetLeft(rect, x);
Canvas.SetTop(rect, y);
youCanvasNameHere.Children.Add(rect);
}
}
您可能需要使用magnify.exe
才能看到它。
答案 1 :(得分:1)
您正在获得正确的鼠标位置并使用正确的方法来执行此操作。如果您的Border
元素的Width
600
且其Height
设置为800
,则任何包含的UI元素都将继承这些相同的值。这意味着您的linecontrol ItemsControl
元素也将是600
x 800
。仅当您的Border.BorderThickness
或Border.Padding
(或其他尺寸更改属性)设置为正值时,所包含控件的大小才会更改。
即使这样,如果您的Border.BorderThickness
属性设置为1
,那么您的ItemsControl.Width
将是598
而不是599
,所以我怀疑你可能误读了你的价值观。我使用您的代码运行您的实验,发现Width
和Height
值从0
变为600
分别是0
到800
。因此,您要么错误地阅读了自己的价值观,要么需要修改问题以提供all relevant code required to successfully reproduce your problem。