Я работаю над большим приложением и добавляю в него некоторые функции перетаскивания.В частности, я разрешаю пользователю перетаскивать файл в главное окно, чтобы открыть его.
Проблема заключается в том, что операция перетаскивания все еще может выполняться, когда в главном окне отображается диалоговое окно.поле (например, окно свойств для элемента в текущем открытом файле).Я бы предпочел, чтобы это не происходило, если в главном окне отображается модальное диалоговое окно.Это связано с тем, что загрузка нового файла в приложение при открытом диалоговом окне может привести к сбою программы: код, вызывающий диалоговое окно, не ожидает изменения открытого файла при открытом диалоговом окне (именно поэтому диалоговое окнобыл модальным ...).
Основное приложение написано на C ++, но я публикую пример C #.Симптом / поведение одинаково на обеих платформах, но я могу продемонстрировать это в гораздо меньшем количестве кода на C #.Я хорошо знаком с обоими языками / платформами, поэтому могу при необходимости переводить любые ответы на соответствующий язык.
Чтобы продемонстрировать проблему с моим примером кода, скомпилируйте и запустите следующий код C #.Это создаст «главное окно», которое является допустимой целью перетаскивания.Перетащите файл из Проводника Windows в главное окно: вы должны увидеть «упавшее» окно сообщения.Теперь нажмите кнопку в форме, чтобы открыть диалоговое окно.Снова попытайтесь перетащить файл в главное окно, пока открыто диалоговое окно.Обратите внимание, что удаление разрешено, даже если модальное диалоговое окно открыто.Как я могу предотвратить это, когда диалоговое окно открыто?
Очевидный ответ - временно установить AllowDrop в false при открытии диалогового окна.Проблема в том, что основное приложение очень большое, и поэтому есть множество мест, которые открывают диалоговые окна.Будет трудно найти каждое место, где открывается диалог, и добавить этот код.Кроме того, каждый разработчик должен знать, что нужно выполнять это действие каждый раз, когда он открывает модальное окно;вряд ли все будут помнить.Я обеспокоен тем, что это не очень хорошее решение.
Конечно, есть более понятный способ сделать это, который не требует добавления кода в каждом месте, где открыт диалог?
using System;
using System.Windows.Forms;
using System.Drawing;
public class MyDialog : Form {
public MyDialog() {
Text = "MyDialog";
}
}
public class MainForm : Form {
public MainForm() {
Button btn = new Button();
btn.Location = new Point(0, 0);
btn.Text = "ShowDialog";
btn.Size = new Size(75, 23);
btn.Click += new EventHandler(GoToDialog);
this.AllowDrop = true;
this.Controls.Add(btn);
this.Text = "Drop Target";
this.DragDrop += new DragEventHandler(this.MyDragDrop);
this.DragEnter += new DragEventHandler(this.MyDragEnter);
}
private void MyDragDrop(object sender, DragEventArgs e) {
MessageBox.Show("dropped");
}
private void MyDragEnter(object sender, DragEventArgs e) {
e.Effect = DragDropEffects.Copy;
}
private void GoToDialog(object sender, EventArgs e) {
using (MyDialog ab = new MyDialog()) {
ab.ShowDialog(this);
}
}
}
static class Program {
[STAThread]
static void Main() {
Application.Run(new MainForm());
}
}