Как отключить перетаскивание при открытом диалоговом окне - PullRequest
5 голосов
/ 15 июня 2011

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

Проблема заключается в том, что операция перетаскивания все еще может выполняться, когда в главном окне отображается диалоговое окно.поле (например, окно свойств для элемента в текущем открытом файле).Я бы предпочел, чтобы это не происходило, если в главном окне отображается модальное диалоговое окно.Это связано с тем, что загрузка нового файла в приложение при открытом диалоговом окне может привести к сбою программы: код, вызывающий диалоговое окно, не ожидает изменения открытого файла при открытом диалоговом окне (именно поэтому диалоговое окнобыл модальным ...).

Основное приложение написано на 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());
    }
}

1 Ответ

2 голосов
/ 15 июня 2011

Я не уверен, как все работает в C #, поэтому дайте мне знать, если этот ответ неверен.В C ++ MFC главное окно отключено, когда отображается диалоговое окно.Вы можете проверить, отключено ли главное окно, и проигнорировать сброс, если это так.

private void MyDragDrop(object sender, DragEventArgs e) {
    if (CanFocus)
        MessageBox.Show("dropped");
}
private void MyDragEnter(object sender, DragEventArgs e) {
    if (CanFocus)
        e.Effect = DragDropEffects.Copy;
    else
        e.Effect = DragDropEffects.None;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...