【问题标题】:Repeated point creation重复点创建
【发布时间】:2015-08-21 06:06:05
【问题描述】:

我正在使用 MousePosition 来尝试确定触发 MouseDown 事件后用户移动鼠标的方式。问题是我正在尝试使用 Point 数据类型创建一个起始变量,我只希望这个 Point 填充一次数据,但我将它放在 MouseDown 中,因此我可以使用鼠标参数 eX 和 eY 来确定 MouseDown 事件的位置叫。这是我想的一个例子

public void panel1_MouseDown(object sender, MouseEventArgs e)
{
    Point start = new Point(e.X, e.Y);
}
public void panel1_MouseMove(object sender, MouseEventArgs e)
{
    if(MousePosition.X > start.X)
    {
        Console.WriteLine("you have moved right");
    }
}

那么我如何只创建一次启动变量,同时仍然可以访问 e 鼠标参数。以及如何访问 panel1_MouseDown 和 panel1_MouseMove 之间的变量?如果您也看到这样做的更好选择,那就太好了!谢谢大家的帮助!

【问题讨论】:

  • 您不能让其他函数读取局部变量。拥有一个类成员(以及一个确定鼠标是否按下的布尔值)有什么问题?另外,由于Point 是一个值类型(struct),你不能让它“未初始化”(即它的值不能是null
  • 在您的类中将start 设为私有变量,并在MouseDown 方法中丢失类型声明(Point)。

标签: c#


【解决方案1】:

如果你讨厌定义新的类成员(出于某种原因),这是你至少可以拥有的:

Point? start = null;
public void panel1_MouseDown(object sender, MouseEventArgs e)
{
    start = new Point(e.X, e.Y);
}
public void panel1_MouseUp(object sender, MouseEventArgs e)
{
    start = null;
}
public void panel1_MouseMove(object sender, MouseEventArgs e)
{
    if(start.HasValue)
      if(MousePosition.X > start.Value.X)
        Console.WriteLine("you have moved right");
}

但为了清楚起见(和功能),我还有一个额外的布尔变量:

bool mouseIsDown = false;
Point start;

public void panel1_MouseDown(object sender, MouseEventArgs e)
{
    start = new Point(e.X, e.Y);
    mouseIsDown = true;
}
public void panel1_MouseUp(object sender, MouseEventArgs e)
{
    mouseIsDown = false;
}
public void panel1_MouseMove(object sender, MouseEventArgs e)
{
    if(mouseIsDown)
      if(MousePosition.X > start.X)
        Console.WriteLine("you have moved right");
}

【讨论】:

  • 没想到现在看到了非常感谢:)
【解决方案2】:

将起点声明为私有类变量

Private Point start;

public void panel1_MouseDown(object sender, MouseEventArgs e)
{
    this.start = new Point(e.X, e.Y);
}
public void panel1_MouseMove(object sender, MouseEventArgs e)
{
        if(MousePosition.X > this.start.X)
        {
            Console.WriteLine("you have moved right");
        }
}

【讨论】:

  • 我想从他那里写的内容,只需添加 panel1_mousedown, if(start == default(Point)) ,否则用户每次按下鼠标都会启动启动跨度>
  • Pointstruct,不能为空
  • 您可以使用 default(Point) 代替或使其可以为空 => Point?然后你可以给它分配 null
  • @HadiHassan default(Point) 更可能是 Point(0,0),这是一个完全有效的值,绝不意味着“未初始化”
猜你喜欢
  • 2014-11-20
  • 2012-09-27
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多