Мы с сыном вместе работаем над проектом для хобби (приложение 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
Вы определенно преувеличиваете «тонны кода», эти обработчики событий подходят для всех графических ящиков. Вы, однако, не писали об этом достаточно, перетащите изображение из Проводника, чтобы увидеть, как это пошло не так. –