当ShowDialog退出时,如何防止焦点更改?

时间:2009-06-22 12:11:34

标签: c# .net winforms focus

我正在尝试为我们的应用程序实现类似alt的选项卡。当用户按下ctrl-tab时,弹出一个表单(使用ShowDialog);当他们再次按下它时,它将下一个控件聚焦在应用程序的主窗体中。当他们释放ctrl时,表单被隐藏。

不幸的是,当发生这种情况时,焦点会被发送到与焦点相对应的不同控件。当ShowDialog退出时,如何防止焦点更改?

4 个答案:

答案 0 :(得分:1)

您可以编写一个自定义对话框,将“to”焦点控件作为属性接受....然后在退出时,您可以将焦点设置为“to”控件。

答案 1 :(得分:0)

您可能需要考虑更改对话框的工作方式。如果我理解您所说的内容,您可以在CtrlTabDialog上创建一个属性,指示哪个控件应该获得焦点。然后,当ShowDialog()退出时,在处理CtrlTabDialog表单之前,您可以读取该属性并从最初生成表单的任何代码中适当地设置焦点。

答案 2 :(得分:0)

您不应将ShowDialog()用于此类目的。相反,您应该使用Show()和Hide(),在主窗体中使用控制逻辑。

你也可能想要阻止表单激活,在这种情况下,make form descendant并覆盖ShowWithoutActivation方法。

您还可以阅读我的帖子here

答案 3 :(得分:0)

我写了一个小应用程序,展示了我将如何处理你描述的行为。

我用四个控件设置我的主窗体(这个例子只是按钮,可以是你想要的任何控件)。然后我设置了另一个充当选择器的表单。对于此示例,它只包含一个ListBox,其中包含控件名称。你可以做一些比较漂亮的东西。您还可以传入当前聚焦的控件,以便在列表中选择该控件。我违反了列表中的第一个控件。

我在MainForm上设置一个名为NextControl的公共属性,以从Chooser表单中保存所选控件。我还设置了一个List属性来保存对您希望能够选择的所有控件的引用。使用此方法,ShowDialog应该可以正常工作,因为在Dialog退出之后,才会在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();
                        }
                    }
                }
            }
        }
    }
}

选择器:

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();
            }
        }
    }
}

您可以根据自己的需要进行修改。它为我改变了焦点。