根据鼠标的位置绘制矩形

时间:2014-02-02 20:27:58

标签: c# wpf canvas

我觉得我有点难以思考。我有一个被边框包围的画布,我想在鼠标周围画一个矩形。我的问题是,鼠标可以移动,我想要的就像数据网格。例如,在数据网格中,所有单元格都已经可见,(我知道我可以使它们不可见,这不是重点),但所有单元格都是静态的,我要做的是当我将鼠标悬停在画布上时,矩形被绘制在一个静态位置,对不起,如果我不清楚。下面的图片应该更好。

First

Second

Third

因此,你可以在第一张图片中看到我的鼠标在那里,我得到了一些价值,我想要的是每当我在我得到这个值的地方我画了一个矩形。正如您在第二张图片中看到的那样,当我稍微移动鼠标时,我仍然在我具有相同值的区域中,因此矩形仍然在那里,而在第三张图片上我已经移动了一点并且您看到x坐标发生了变化,并且值也发生了变化,那么矩形必须再次在另一部分上绘制

我的问题是我不知道如何绘制相对于鼠标相对于画布的45 x 40的矩形,因为如果鼠标位于x:0 Y:0那么矩形将是45 x 40但是如果我的鼠标位于X:10 Y:10那么矩形就必须是,如果鼠标是10的开始点,鼠标是30,然后是10,左边是35,右边是35,我试过尽可能清楚,如果仍然混淆告诉我,我会尽力而为。

2 个答案:

答案 0 :(得分:0)

只要鼠标在元素上移动,就会触发MouseMove事件。如果我理解你的问题,你想知道鼠标在Canvas上移动时的位置。因此,向Canvas添加一个事件处理程序。确保画布名称,您需要在鼠标事件处理程序中引用的名称。

<强> XAML

 <Border Margin='20'
          BorderBrush='Orange'
          BorderThickness='2'>
    <Canvas x:Name='DrawingCanvas' 
            MouseMove='DrawingCanvas_MouseMove' 
            Background='Transparent'>
      <Rectangle x:Name='MouseRectangle'
                 Width='30'
                 Height='30' 
                 Stroke='Purple' 
                 StrokeThickness='2'  />
    </Canvas>

  </Border>

MouseMove事件提供 MouseEventArgs 参数。使用它来获取相对于UI中任何元素的鼠标位置。在你的情况下,那将是画布。

<强>代码

将矩形居中于鼠标尖端

 private void DrawingCanvas_MouseMove(object sender, MouseEventArgs e) {

      Canvas.SetTop(MouseRectangle, 
                    e.GetPosition(DrawingCanvas).Y - MouseRectangle.Height/2);
      Canvas.SetLeft(MouseRectangle,
                     e.GetPosition(DrawingCanvas).X - MouseRectangle.Width /2);
    }

答案 1 :(得分:0)

您可以使用TranslateTransform Class和几个double属性轻松实现您的要求:

<Rectangle Name="Rectangle" Stroke="Black" StrokeThickness="1" Fill="{x:Null}">
    <Rectangle.RenderTransform>
        <TranslateTransform X="{Binding XTransform}" Y="{Binding YTransform}" />
    </Rectangle.RenderTransform>
</Rectangle>

您可以处理UIElement.PreviewMouseMove元素上的Canvas事件,并从处理程序更新两个转换属性...尝试这样的事情:

private void CanvasPreviewMouseMove(object sender, MouseEventArgs e)
{
    XTransform = e.GetPosition(Rectangle).X;
    YTransform = e.GetPosition(Rectangle).Y;
}