问题由来:
在程序设计中,使用Dev这套控件的工具条菜单控件所添加的菜单按钮设置快捷键。当打开界面按下快捷键时,会触发该按钮的点击事件,这是一种很方便的功能。
这种设置针对程序只有一个单一的窗体是很不错,但是一般大的项目都是一个主界面,添加一个TabControl,其它的功能窗体都是作为一个TabPage去show出来。面对这种分格的软件去通过每个界面再设置按钮快捷键就行不通了。
Bug:
亲自测试出现的一个问题就是,当我在其中一个窗体设置了新增,修改,删除三个按钮的快捷键。另一个窗体只有删除按钮,并且也给它设置快捷键。(同一套软件,统一功能按钮设置快捷键是一样的组合键,比如所有的新增都用Ctrl+N,修改用Ctrl+E,删除用Ctrl+D)
第一个窗体设置了3个按钮的快捷键,使用都没问题。第二个窗体的删除按钮快捷键使用也没有问题。问题出在第二个窗体没有新增与修改按钮,但是按下快捷键时,会触发第一个窗口的新增与修改按钮的点击事件。这样肯定是有问题的。所以就不能够使用这种直接去界面设置barManage中按钮的itemShortCut属性的方式了。
解决方案:
面对这种情况,这里记录一种好理解的简单做法。
首先,找到最外层的那个窗体(也就是软件的主窗体),通过这个窗体的KeyUp事件去捕获按下了什么快捷键,其次判断当前TabControl显示的是哪一个TabPage。通过判断当前TabPage这个界面是否拥有快捷键对应的按钮去设置是否触发按钮的点击事件。
private void MainForm_KeyUp(object sender, KeyEventArgs e)
{
SetShortCut(tabMain.SelectedTabPage, e);
}
/// <summary>
/// 设置快捷键
/// </summary>
/// <param name="page">当前页</param>
/// <param name="e">快捷键</param>
public void SetShortCut(XtraTabPage page, KeyEventArgs e)
{
if (page == null) return;
if (e.Control && e.KeyCode == Keys.E)
{
GetShortCut(page, "bbiUpdate"); //修改按钮
}
else if (e.Control && e.KeyCode == Keys.D)
{
GetShortCut(page, "bbiDelete"); //删除按钮
}
else if (e.Control && e.KeyCode == Keys.N)
{
GetShortCut(page, "bbiAdd"); //新增按钮
}
}
/// <summary>
/// 获取按钮调用方法
/// </summary>
/// <param name="page">当前页</param>
/// <param name="name">按钮的Name</param>
private void GetShortCut(XtraTabPage page, string name)
{
//取得窗体
Control control = page.GetContainerControl().ActiveControl;
Type type = control.GetType();
//获取窗体中菜单按钮
List<FieldInfo> controls= type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public).Where(p => p.FieldType == typeof(BarManager)).ToList();
if (controls.Any())
{
//为什么用controls[0],因为我这里一个界面只有一个barManage菜单
BarItemLink itemLink = controls[0].ItemLinks.FirstOrDefault(o => o.Item.Name == name);
//有的菜单按钮是一个多功能按钮,比如说一个新增按钮,它的修改和删除是动态绑定到这个按钮的下拉中的,就要考虑这种下拉的情况
if (itemLink == null)
{
itemLink = controls[0].ItemLinks.FirstOrDefault(o => o.Item.Name == "bbiAdd");
if (itemLink != null && itemLink.Item != null)
{
BarButtonItem barButtonItem = itemLink.Item as BarButtonItem;
if (barButtonItem != null && barButtonItem.DropDownControl != null)
{
var drop = barButtonItem.DropDownControl as PopupMenu;
if (drop != null)
itemLink = drop.ItemLinks.FirstOrDefault(o => o.Item.Name == name);
}
}
}
//触发按钮的点击事件
if (itemLink != null && itemLink.Item != null)
{
itemLink.Item.PerformClick();
}
}
}