Как сфокусировать элемент управления в MDIParent, когда все дочерние окна закрыты? - PullRequest
2 голосов
/ 06 июня 2010

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

Может кто-нибудь сказать мне, что мне не хватает?

В приведенном ниже примере «первый фокус» получает удар и выполняет свою работу правильно (если я закомментирую первую строку фокуса, мое дерево не получает фокус при запуске, поэтому оно должно выполнять свою работу, верно?) К сожалению, несмотря на то, что «второй фокус» ударил, мое дерево не заканчивается фокусом, когда я закрываю дочернее окно.

Имеет фокус при запуске.

Имеет фокус http://www.programmingforpeople.com/images/stackoverflow/focus1.PNG

Не фокусируется после закрытия дочернего окна.

Нет фокуса http://www.programmingforpeople.com/images/stackoverflow/focus2.PNG


Пример

using System;
using System.Windows.Forms;

namespace mdiFocus
{
   class ParentForm : Form
   {
      public ParentForm()
      {
         IsMdiContainer = true;
         tree = new TreeView();
         tree.Nodes.Add("SomeNode");
         tree.Dock = DockStyle.Left;
         Controls.Add(tree);
      }
      protected override void OnShown(EventArgs e)
      {
         Form child = new Form();
         child.MdiParent = this;
         child.Show();
         child.FormClosed += new FormClosedEventHandler(child_FormClosed);
         tree.Focus(); // first focus works ok
      }
      void child_FormClosed(object sender, FormClosedEventArgs e)
      {
         tree.Focus(); // second focus doesn't seem to work, even though it is hit :(
      }
      TreeView tree;
   }

   static class Program
   {
      [STAThread]
      static void Main()
      {
         Application.Run(new ParentForm());
      }
   }
}

1 Ответ

1 голос
/ 06 июня 2010

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

    private void toolStripButton1_Click(object sender, EventArgs e) {
        Form child = new Form2();
        child.MdiParent = this;
        child.FormClosed += new FormClosedEventHandler(child_FormClosed);
        child.Show();
    }

    void child_FormClosed(object sender, FormClosedEventArgs e) {
        if (this.MdiChildren.Length == 1) {
            this.BeginInvoke(new MethodInvoker(() => treeView1.Focus()));
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...