Показать форму, что showDialog из mainForm не заблокирует его, но закрытие mainForm закроет его - PullRequest
1 голос
/ 14 апреля 2010

как вы показываете форму, которая должна работать синхронно. Я попытался запустить application.run из очереди в пуле потоков, но иногда у меня были некоторые недействительные дескрипторы. попытался использовать обычный поток, но потом, когда основная форма закрывается, он не закрывается - и мне не очень нравится идея убить поток on_formclosing. если я использую form.show, то это хорошо, кроме того факта, что любой showdialog из основной формы будет блокировать и это. Какой лучший способ справиться с этим?

Ответы [ 4 ]

3 голосов
/ 14 апреля 2010

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

Но вы можете с помощью хитрости и делать это осторожно. Вызов ShowDialog () перебирает все открытые формы и отключает их. Вы можете повторно включить его, используя P / Invoking API-функцию EnableWindow (). Хитрость заключается в том, чтобы сделать это, пока отображается диалоговое окно, Control.BeginInvoke () может сделать это.

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

  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      button1.Click += new EventHandler(button1_Click);
    }
    private Form2 mNonModal;
    void button1_Click(object sender, EventArgs e) {
      this.BeginInvoke(new MethodInvoker(makeNonModal));
      new Form3().ShowDialog(this);
    }
    void makeNonModal() {
      if (mNonModal != null) EnableWindow(mNonModal.Handle, true);
    }
    protected override void OnLoad(EventArgs e) {
      mNonModal = new Form2();
      mNonModal.FormClosed += (s, ea) => mNonModal = null;
      mNonModal.Show();
    }
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern void EnableWindow(IntPtr hWnd, bool enable);
  }
1 голос
/ 14 апреля 2010

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

1 голос
/ 14 апреля 2010

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

0 голосов
/ 15 апреля 2010

Попробуйте использовать Show() вместо ShowDialog(). А также, создайте объект вашего класса формы, например MyForm^ theForm = gcnew MyForm();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...