我觉得我有点难以思考。我有一个被边框包围的画布,我想在鼠标周围画一个矩形。我的问题是,鼠标可以移动,我想要的就像数据网格。例如,在数据网格中,所有单元格都已经可见,(我知道我可以使它们不可见,这不是重点),但所有单元格都是静态的,我要做的是当我将鼠标悬停在画布上时,矩形被绘制在一个静态位置,对不起,如果我不清楚。下面的图片应该更好。
因此,你可以在第一张图片中看到我的鼠标在那里,我得到了一些价值,我想要的是每当我在我得到这个值的地方我画了一个矩形。正如您在第二张图片中看到的那样,当我稍微移动鼠标时,我仍然在我具有相同值的区域中,因此矩形仍然在那里,而在第三张图片上我已经移动了一点并且您看到x坐标发生了变化,并且值也发生了变化,那么矩形必须再次在另一部分上绘制
我的问题是我不知道如何绘制相对于鼠标相对于画布的45 x 40的矩形,因为如果鼠标位于x:0 Y:0那么矩形将是45 x 40但是如果我的鼠标位于X:10 Y:10那么矩形就必须是,如果鼠标是10的开始点,鼠标是30,然后是10,左边是35,右边是35,我试过尽可能清楚,如果仍然混淆告诉我,我会尽力而为。
答案 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;
}