我正在尝试为我们的应用程序实现类似alt的选项卡。当用户按下ctrl-tab时,弹出一个表单(使用ShowDialog
);当他们再次按下它时,它将下一个控件聚焦在应用程序的主窗体中。当他们释放ctrl时,表单被隐藏。
不幸的是,当发生这种情况时,焦点会被发送到与焦点相对应的不同控件。当ShowDialog退出时,如何防止焦点更改?
答案 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();
}
}
}
}
您可以根据自己的需要进行修改。它为我改变了焦点。