如何防止使用事件重复代码

时间:2016-04-04 15:22:02

标签: c#

我是初学程序员,我觉得我不必要地重复代码。我想制作一个由16个图片盒组成的图片益智游戏。问题是我觉得我必须为每个图片框的事件重复代码,如下例所示:

       Point move;
    bool isDragging = false;
    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        isDragging = true;
        move = e.Location;
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {

        if(isDragging == true)
        {
            pictureBox1.Left += e.X - move.X;
            pictureBox1.Top += e.Y - move.Y;
            pictureBox1.BringToFront();
        }

    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        isDragging = false;
    }

4 个答案:

答案 0 :(得分:8)

只需为3个事件中的每个事件创建一个方法:

require 'mechanize'
require 'uri'

SEARCH = "test"

@agent = Mechanize.new
page = @agent.get('http://www.google.com/')
google_form = page.form('f')
google_form.q = "#{SEARCH}"
url = @agent.submit(google_form, google_form.buttons.first)
  url.links.each do |link|
    if link.href.to_s =~ /url.q/
      str = link.href.to_s
      str_list = str.split(%r{=|&})
      urls = str_list[1]
      urls_to_log = URI.decode(urls)
      puts urls_to_log
      time = 10
      loop do
        next_page = page.link_with(:text => 'Next')
        page = link.click
        time -= 1
      end
      if time == 0
        break
      end
    end
  end

然后转到设计器中的16个图片框中的每一个,并将private void pictureBox_MouseDown(object sender, MouseEventArgs e) { isDragging = true; move = e.Location; } private void pictureBox_MouseMove(object sender, MouseEventArgs e) { if(isDragging == true) { // Luckily the sender parameter will tell us which PictureBox we are dealing with PictureBox pb = (PictureBox)sender; pb.Left += e.X - move.X; pb.Top += e.Y - move.Y; pb.BringToFront(); } } private void pictureBox_MouseUp(object sender, MouseEventArgs e) { isDragging = false; } 事件处理程序设置为指向MouseUp,并将pictureBox_MouseUp事件处理程序指向MouseMovepictureBox_MouseMove事件处理程序指向MouseDown。为16个图片框中的每一个执行此操作。

答案 1 :(得分:1)

尝试为所有PictureBox控件触发相同的事件

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    isDragging = true;
    move = e.Location;
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    PictureBox pictureBox = sender as PictureBox;
    if(isDragging == true)
    {
        pictureBox .Left += e.X - move.X;
        pictureBox .Top += e.Y - move.Y;
        pictureBox .BringToFront();
    }

}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    isDragging = false;
}

答案 2 :(得分:1)

创建一个包含Image组件的新组件并设置dock parent container。将拖放代码写入新组件。 例如,

public partial class DraggablePictureBox : UserControl
{
    public DraggablePictureBox()
    {
        InitializeComponent();
    }

    /// <summary>
    /// Sets image of inner picture
    /// </summary>
    public Image Image
    {
        get {
            return InnerPictureBox.Image;
        }
        set
        {
            InnerPictureBox.Image = value;
        }
    }

    private void InnerPictureBox_MouseMove(object sender, MouseEventArgs e)
    {
        if (isDragging == true)
        {
            this.Left += e.X - move.X;
            this.Top += e.Y - move.Y;
            this.BringToFront();
        }

    }

    private void InnerPictureBox_MouseUp(object sender, MouseEventArgs e)
    {
        isDragging = false;
    }

    private void InnerPictureBox_MouseDown(object sender, MouseEventArgs e)
    {
        isDragging = true;
        move = e.Location;
    }

    private Point move;
    private bool isDragging = false;
}

现在您有一个图像拖放代码。

enter image description here

enter image description here

答案 3 :(得分:0)

解决这个问题的一种方法是将这些方法放在方法中,例如

MovePicturePox(Point move, Point newPos, PictureBox pb)
{
    pb.Left += newPos.X - move.X;
    pb.Top += newPos.Y - move.Y;
    pb.BringToFront();
}

然后可以像这样调用这些方法

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if(isDragging == true)
    {
        MovePictureBox(move, new Point(e.X, y.Y), pictureBox1);
    }

}