我是WPF的新手。
我想在Canvas上的鼠标移动事件上画一个圆圈。我已经编写了在画布上拖动它的逻辑。但是我想在鼠标点击我的画布时创建一个圆圈,它应该根据鼠标在画布上的移动来调整大小。
我怎样才能做到这一点?
这是我的代码
Ellipse elip = new Ellipse();
private double pointx;
private double pointy;
private void canvas_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
canvas.MouseMove -= MouseMove_NotDown;
canvas.MouseMove += canvas_PreviewMouseMove;
canvas.MouseUp += canvas_PreviewMouseUp;
Point location = e.MouseDevice.GetPosition(canvas);
elip = new Ellipse();
elip.Height = 1;
elip.Width = 1;
elip.Stroke = Brushes.Black;
elip.StrokeThickness = 2;
Canvas.SetTop(elip, location.Y + 1);
Canvas.SetLeft(elip, location.X + 1);
pointx = location.X + 1;
pointy = location.Y + 1;
canvas.Children.Add(elip);
}
private void MouseMove_NotDown(object sender, MouseEventArgs e)
{
canvas.Cursor = Cursors.Hand;
}
private void canvas_PreviewMouseMove(object sender, MouseEventArgs e)
{
try
{
Point location = e.MouseDevice.GetPosition(canvas);
double height = location.Y - pointy;
double width = location.X - pointx;
if (height >= 0 && width >= 0)
{
elip.Height = height;
elip.Width = width;
}
else if (height < 0 || width < 0)
{
if (height < 0)
{
elip.Height = height + (-height) + 1;
elip.Width = width;
}
else if (width < 0)
{
elip.Height = height;
elip.Width = width + (-width) + 1;
}
}
}
catch
{
}
}
private void canvas_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
elip.Stroke = Brushes.Black;
elip.StrokeThickness = 2;
canvas.MouseMove -= canvas_PreviewMouseMove;
canvas.MouseMove += MouseMove_NotDown;
canvas.MouseUp += canvas_PreviewMouseUp;
}
最好只与听众联系一次。这使得应用程序逻辑更容易理解和调试。
如果WPF的画布没有背景设置,则除非在画布中单击了某个内容,否则它不会捕获鼠标事件,因此请为其指定背景颜色(白色或透明即可)
XAML:
<Window x:Class="mausing.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:mausing"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Canvas x:Name="canvas" Background="White"></Canvas>
</Grid>
C#:
public partial class MainWindow : Window
{
private Ellipse elip = new Ellipse();
private Point anchorPoint;
public MainWindow()
{
InitializeComponent();
canvas.MouseMove += canvas_MouseMove;
canvas.MouseUp += canvas_MouseUp;
canvas.MouseDown += canvas_MouseDown;
}
private void canvas_MouseDown(object sender, MouseButtonEventArgs e)
{
//capture the mouse on the canvas
//(this also helps us keep track of whether or not we're drawing)
canvas.CaptureMouse();
anchorPoint = e.MouseDevice.GetPosition(canvas);
elip = new Ellipse
{
Stroke = Brushes.Black,
StrokeThickness = 2
};
canvas.Children.Add(elip);
}
private void canvas_MouseMove(object sender, MouseEventArgs e)
{
//if we are not drawing, we don't need to do anything when the mouse moves
if (!canvas.IsMouseCaptured)
return;
Point location = e.MouseDevice.GetPosition(canvas);
double minX = Math.Min(location.X, anchorPoint.X);
double minY = Math.Min(location.Y, anchorPoint.Y);
double maxX = Math.Max(location.X, anchorPoint.X);
double maxY = Math.Max(location.Y, anchorPoint.Y);
Canvas.SetTop(elip, minY);
Canvas.SetLeft(elip, minX);
double height = maxY - minY;
double width = maxX - minX;
elip.Height = Math.Abs(height);
elip.Width = Math.Abs(width);
}
private void canvas_MouseUp(object sender, MouseButtonEventArgs e)
{
// we are now no longer drawing
canvas.ReleaseMouseCapture();
}
}
我在画布上处理鼠标事件时遇到问题。我想用鼠标来绘制它,我已经想出了这些事件处理程序,但当我开始绘制时,它们什么都不做。 你能帮我告诉我遗漏了什么或者如何重写它以便它开始工作吗?
问题内容: 我只想在鼠标单击后绘制圆圈。由于paintComponent方法调用了自身,因此首先绘制圆而无需单击。 问题答案: 您的代码存在一些问题: 你永远不会打电话 你只需要一个和 请注意,当您调整框架大小时,某些圆圈将消失,并且总体上以奇怪的方式表现。 我会将所有s 存储在用户单击的位置,然后在方法内部遍历该列表。这样您就可以通话,而圈子不会消失。 更改后的工作代码:
我使用以下代码在inkcanvas上的鼠标位置绘制一个正方形。但它不会在鼠标位置的中心绘制形状,而是稍微向右,再低一些,如下图所示: 此外,当我点击向画布添加形状时,我想停止笔的绘制。 怎样才能正确定位,停止画笔呢?
问题内容: 我正在使用Java。我想根据mousedrag事件绘制矩形。如果用户拖动鼠标,则小程序上的矩形应根据当前鼠标坐标增加或减少。我有以下代码。 在下面的代码中,我使用[b] SelectionArea [/ b]类扩展了在其上执行绘制操作的画布。我在此类中使用[b] image [/ b]变量进行双缓冲,以减少闪烁并保存小程序的先前状态(即,绘制小程序的内容) 但如果我画第一个矩形,代码工
我想在画布上绘制200个或更多(高度流动)对象 并将鼠标添加到每个事件上,鼠标单击事件 像这样的源代码... (valiable k是增加的) “ 对于(k=0;k } 我的希望是... 如果鼠标放在形状上,显示有效k 如果鼠标点击形状,转到其他带有有效k参数的url 但是,我不想使用图像。 请帮帮我。 谢谢。
问题内容: 如标题所示,我很难在JApplet中绘制一些矩形(填充的)。确切的目标是拥有一张50x50的表格,并在您 点击目标单元格时将其填充(可以通过绘制一个填充的矩形来完成)。我已经完成了有关起点坐标的数学运算, 但是由于某些原因,我无法在MouseClicked方法中绘制新矩形。有什么建议? 问题答案: 这是一个相对简单的概念(没有冒犯性)。 首先,请勿将代码与JApplet和混合使用JFr