Как я могу предотвратить изменение фокуса при выходе из ShowDialog? - PullRequest
2 голосов
/ 22 июня 2009

Я пытаюсь реализовать поведение alt-tab для нашего приложения. Когда пользователь нажимает Ctrl + Tab, появляется форма (с помощью ShowDialog); когда они нажимают его снова, он фокусирует следующий элемент управления в основной форме приложения. Когда они выпускают Ctrl, форма скрыта.

К сожалению, когда это происходит, фокус отправляется на элемент управления, отличающийся от того, на котором фокусировался. Как я могу предотвратить изменение фокуса при выходе из ShowDialog?

Ответы [ 4 ]

1 голос
/ 22 июня 2009

Вы можете написать собственный диалог, который принимает элемент управления фокусировкой "to" как свойство .... затем при выходе вы можете установить фокус на элемент управления "to".

0 голосов
/ 28 ноября 2009

Я написал небольшое приложение, которое показывает, как я буду справляться с описанным вами поведением.

Я настроил свою основную форму с четырьмя элементами управления (только кнопки для этого примера могут быть любыми элементами управления). Затем я установил другую форму, которая действует как выбор. Для этого примера он просто содержит ListBox с именами элементов управления. Вы могли бы сделать что-то более причудливое. Вы также можете передать текущий фокусированный элемент управления, чтобы тот уже был выбран в списке. По умолчанию я установил первый элемент управления в списке.

Я установил открытое свойство в MainForm под названием NextControl для хранения выбранного элемента управления из формы Chooser. Я также настроил свойство List для хранения ссылок на все элементы управления, из которых вы хотите выбрать. Используя этот метод, ShowDialog должен работать нормально, потому что фокус не устанавливается на элемент управления Next до тех пор, пока не завершится этот диалог.

MainForm:

using System.Collections.Generic;
using System.Windows.Forms;

namespace Tabber
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
            ControlList = new List<Control>(new Control[] {button1, button2, button3, button4});
        }

        private List<Control> ControlList { get; set; }

        public Control NextControl { get; set; }

        private void MainForm_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Tab)
            {
                using (var chooseDialog = new Chooser(this, ControlList))
                {
                    if (chooseDialog.ShowDialog() == DialogResult.OK)
                    {
                        if (NextControl != null)
                        {
                            NextControl.Focus();
                        }
                    }
                }
            }
        }
    }
}

Chooser:

using System.Collections.Generic;
using System.Windows.Forms;

namespace Tabber
{
    public partial class Chooser : Form
    {
        public Chooser(MainForm sender, List<Control> controls)
        {
            Sender = sender;
            InitializeComponent();

            foreach (Control control  in controls)
            {
                listBox1.Items.Add(control);
            }
            listBox1.DisplayMember = "Name";
            listBox1.SetSelected(0, true);
        }

        private MainForm Sender { get; set; }

        private void Chooser_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Tab)
            {
                if (listBox1.SelectedIndex == listBox1.Items.Count - 1)
                {
                    listBox1.SetSelected(0, true);
                }
                else
                {
                    listBox1.SetSelected(listBox1.SelectedIndex + 1, true);
                }
                e.Handled = true;
            }
        }

        private void listBox1_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.ControlKey)
            {
                Sender.NextControl = (Control) listBox1.SelectedItem;
                DialogResult = DialogResult.OK;
                Close();
            }
        }
    }
}

Вы можете изменить это в соответствии со своими потребностями. Для меня это изменило фокус.

0 голосов
/ 22 июня 2009

Вы не должны использовать ShowDialog () для таких целей. Вместо этого вы должны использовать Show () и Hide (), с логикой управления внутри вашей главной формы.

Вы также можете вообще запретить активацию формы, в этом случае сделайте Form потомком и переопределите метод ShowWithoutActivation.

Вы также можете прочитать мой пост здесь .

0 голосов
/ 22 июня 2009

Возможно, вы захотите изменить способ работы вашего диалога. Если я понимаю, что вы говорите, вместо этого вы можете создать свойство на CtrlTabDialog, которое будет указывать, какой элемент управления должен получить фокус. Затем, когда выйдет ShowDialog(), перед тем, как вы удалите форму CtrlTabDialog, вы можете прочитать это свойство и правильно установить фокусировку из любого кода, породившего форму.

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