了解Border的属性

时间:2014-03-02 13:43:01

标签: c# wpf canvas border mousemove

我有一个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]。为什么他们不一致?或者我该如何获得正确的鼠标位置?

2 个答案:

答案 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.BorderThicknessBorder.Padding(或其他尺寸更改属性)设置为正值时,所包含控件的大小才会更改。

即使这样,如果您的Border.BorderThickness属性设置为1,那么您的ItemsControl.Width将是598而不是599,所以我怀疑你可能误读了你的价值观。我使用您的代码运行您的实验,发现WidthHeight值从0变为600分别是0800。因此,您要么错误地阅读了自己的价值观,要么需要修改问题以提供all relevant code required to successfully reproduce your problem