我在WinForms中实现自定义控件。此控件需要响应助记符,并且助记符需要将下一个控件集中在Tab键顺序中 - 就像Label控件那样。
ProcessMnemonic
方法显然是要覆盖的方法。但是,看看Label控件是如何做的,作为参考,表明它在很大程度上依赖于WinForms内部:
我没想到对助记符的回应可能如此复杂。如果我省略所有那些内部调用并且只使用非内部Parent,它似乎有效,但它让我想知道:肯定代码不存在,所以我的天真实现必须缺少某些东西?
这是Label的真实代码,由我调整以便于阅读:
[UIPermission(SecurityAction.LinkDemand, Window=UIPermissionWindow.AllWindows)]
protected internal override bool ProcessMnemonic(char charCode)
{
if ((!UseMnemonic || !IsMnemonic(charCode, Text)) || !CanProcessMnemonic() /*internal*/)
return false;
if (ParentInternal != null) /* internal */
{
IntSecurity.ModifyFocus.Assert(); /* internal */
try
{
if (ParentInternal.SelectNextControl(this, true, false, true, false) && !ParentInternal.ContainsFocus)
ParentInternal.Focus();
}
finally
{
CodeAccessPermission.RevertAssert();
}
}
return true;
}
这是我对它的“天真”改写:
protected override bool ProcessMnemonic(char charCode)
{
if ((!UseMnemonic || !IsMnemonic(charCode, Text)) || !Enabled || !Visible)
return false;
if (Parent != null)
if (Parent.SelectNextControl(this, true, false, true, false) && !Parent.ContainsFocus)
Parent.Focus();
return true;
}
一个显而易见的区别是CanProcessMnemonic
递归地检查父代,而我的代码却没有,因为这种方法是莫名其妙的内部...