2014-03-02 46 views
1

我有一个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

它是x[0,599]y[0,799]。如果您尝试在0,0上绘制一个像素,它将成为左上角的像素,如果您在600,800处绘制该像素,它将在画布外绘制。画一个简单的50×50帆布和运行这个反对看:

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看到它虽然。

+0

谢谢。但为什么我在[0,600]中得到'x,在[1,800]'中得到'y? – herohuyongtao

+1

我从你的示例代码中获得了0,600 0,800,如果你放大,实际的画布像素是0,599 0,799,你会看到600和800实际上是在画布的边缘。 – safetyOtter

+0

但我得到了0.50 x 0.50与同样的实验在一个空的窗口只有一个50x50的画布,而像素只填充0,49 x 0,49;所以我不认为它与你的画布如何获得它的大小有关,只是GetPosition的工作方式。 /耸耸肩 – safetyOtter

1

您正在获取正确的鼠标位置并使用正确的方法来执行此操作。如果您的Border元素的Width600和它的Height设置为800,则任何包含的UI元素将继承那些相同的值。这意味着您的linecontrol ItemsControl元素也将是600 x 800。只有当您的Border.BorderThicknessBorder.Padding(或其他尺寸更改属性)设置为正值时,所包含控件的大小才会更改。

即使这样,如果你的Border.BorderThickness属性设置为1,那么你的ItemsControl.Width598而不是599,所以我怀疑你可能误解了你的价值观。我用你的代码运行实验,发现WidthHeight值从0分赴6000800。因此,无论您是否错误地阅读了您的值,或者您需要编辑您的问题以提供all relevant code required to successfully reproduce your problem

+0

他们不应该分别为0至599和0至799? – herohuyongtao

+0

用您展示的代码自己试试新项目。 – Sheridan

+0

我会做的。谢谢。 – herohuyongtao