2014-01-10 2 views
0

Мы с сыном вместе работаем над проектом для хобби (приложение Winform) для игры в кости Farkle и нуждаемся в руководстве по обработке событий dragdrop для кубиков. Обратите внимание, что мы не ищем ответа или кода; просто некоторые общие идеи об атаке решения.Эффективность события Winform DragDrop

Вот конструкции:

RolledDice -Мы имеют единую форму с двумя панелями. Одна панель содержит 6 PictureBoxes, которые отображают изображения кубиков из ImageList на основе класса DiceRoller, который мы построили для генерации случайных целых чисел от 1 до 6. Мы используем массив BackBox для поддержки итерации по каждому из PictureBoxes. Событие click для кнопки «Roll Dice» отображает свернутые кости - все хорошо, это отлично работает.

PlayerDice -The вторая панель одинаково настроены на первой и принимает выбранный пользователем кости вытащили из проката панели плашек. Наш прецедент требует возможности для пользователя перетаскивать кости из панели Rolled Dice на панель Dice Player и обратно, если пользователь передумает о кубиках, которые они хотят сохранить - все хорошо, это отлично работает.

Постановка задачи -Хотя мы можем перетаскивать кости из проката Dice панели к панели игрока Dice (и обновляют поддержка PictureBox массивов в процессе), представляется необходимым иметь три обработчика событий для каждого из 6 PictureBoxes в обеих панелях (MouseDown, DragEnter и DragDrop), и это составляет тонну кода.

Вопрос -Ести элегантный способ иметь один набор из этих 3 обработчиков событий для всех выпавших на кости и один набор обработчиков событий для всех игроков Dice, а не с кучей тягучего кода, как мы имеем Теперь?

Опять же, мы не ищем точный ответ или код, а также некоторые общие идеи по атаке на решение.

EDITED: Вот код, который мы имеем для ОДНОГО изображения.

#region Mouse and Drag Events 
    // Mouse and Drag Events for ONE Rolled Dice 
    void pbRolled1_MouseDown(object sender, MouseEventArgs e) 
    { 
     PictureBox source = (PictureBox)sender; 
     DoDragDrop(source.Image, DragDropEffects.Move); 
    } 
    void pbRolled1_DragEnter(object sender, DragEventArgs e) 
    { 
     if (e.Data.GetDataPresent(DataFormats.Bitmap)) 
      e.Effect = DragDropEffects.Move; 
    } 
    void pbRolled1_DragDrop(object sender, DragEventArgs e) 
    { 
     PictureBox destination = (PictureBox)sender; 
     destination.Image = (Bitmap)e.Data.GetData(DataFormats.Bitmap); 
    } 

    // Mouse and Drag Events for ONE Player Dice 
    void pbPlayer1_MouseDown(object sender, MouseEventArgs e) 
    { 
     PictureBox source = (PictureBox)sender; 
     DoDragDrop(source.Image, DragDropEffects.Move); 
    } 
    void pbPlayer1_DragEnter(object sender, DragEventArgs e) 
    { 
     if (e.Data.GetDataPresent(DataFormats.Bitmap)) 
      e.Effect = DragDropEffects.Move; 
    } 
    void pbPlayer1_DragDrop(object sender, DragEventArgs e) 
    { 
     PictureBox destination = (PictureBox)sender; 
     destination.Image = (Bitmap)e.Data.GetData(DataFormats.Bitmap); 
    } 
    #endregion 
+0

Вы определенно преувеличиваете «тонны кода», эти обработчики событий подходят для всех графических ящиков. Вы, однако, не писали об этом достаточно, перетащите изображение из Проводника, чтобы увидеть, как это пошло не так. –

ответ

0

Ну события мыши обрабатываются формы Windows, так что реализация будет необходимо сделать на форме, но и для событий перетаскивания вы можете иметь ваши изображения коробки реализовать интерфейс IDropTarget таким образом, чтобы код можно было бы объединить и дать вам код повторного использования и очистки.

+0

Спасибо за предложение! Мы изучим интерфейс IDropTarget и его реализацию. Очень признателен. –

1

Вам необязательно иметь связь 1-к-1 между элементами управления и их событиями - события могут совместно использоваться элементами управления.

Поскольку вам не нужен конкретный ответ, я приведу вам общий пример. Возьмите эту простую форму, с тремя кнопками и этикетки:

Simple Windows Form

Теперь код этой простой форме выглядит следующим образом (Form1.cs):

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      this.button1.Click += new System.EventHandler(this.button_Click); 
      this.button2.Click += new System.EventHandler(this.button_Click); 
      this.button3.Click += new System.EventHandler(this.button_Click); 
     } 

     private void button_Click(object sender, EventArgs e) 
     { 
      Button button = (sender as Button); 
      if (button != null) 
      { 
       label1.Text = string.Format("You pressed {0}", button.Text); 
      } 
     } 
    } 

Вы можете добавить события в режиме «Дизайн» и выберите одно и то же событие для каждого. Я подключил события в конструкторе, чтобы сделать его более очевидным примером.

Обратите внимание, что все три обработчика нажатия кнопок указывают на один обработчик событий. Этот обработчик будет смотреть на sender события, чтобы увидеть, какая кнопка была нажата. Затем он просто берет заголовок кнопки и отображает ее в сообщении на этикетке.

Вы можете делать похожие вещи с повторяющимися событиями, которые вы сейчас создаете (особенно после просмотра кода, добавленного в свой вопрос).

Смежные вопросы