.net 确定助记符/加速器键值是否应用于控件的方法?

.net 确定助记符/加速器键值是否应用于控件的方法?,.net,tabcontrol,accelerator,mnemonics,.net,Tabcontrol,Accelerator,Mnemonics,我有一个最初是VB6应用程序的应用程序(.NETFramework 4,vb.net)。 为了模拟旧选项卡控件行为的一部分,我正在实现允许您切换到另一个选项卡的快捷键。 例子 -TabControl有5个选项卡。 -选项卡2有一个带有文本框的标签和数据(alt-d accelerator) -用户已选择Tab 1,并点击alt-d,这将导致Tab控件选择Tab 2并将焦点设置为相应的文本框 我已经编写了一些代码,用于查找包含控件的选项卡(我通过重写ProcessMnemonic来实现这一点),并

我有一个最初是VB6应用程序的应用程序(.NETFramework 4,vb.net)。 为了模拟旧选项卡控件行为的一部分,我正在实现允许您切换到另一个选项卡的快捷键。 例子 -TabControl有5个选项卡。 -选项卡2有一个带有文本框的标签和数据(alt-d accelerator) -用户已选择Tab 1,并点击alt-d,这将导致Tab控件选择Tab 2并将焦点设置为相应的文本框

我已经编写了一些代码,用于查找包含控件的选项卡(我通过重写ProcessMnemonic来实现这一点),并简单地查看选项卡(从所选的选项卡开始),如果找到匹配项,则选择该选项卡,然后允许系统通过调用“MyBase.ProcessMnemonic(charCode)”来处理该助记符

但我的问题是控制。IsMnemonic呼叫。由于只传递控件的“Text”,因此在其Text属性中包含&的任何控件都可以使其匹配

例如,myTextbox.Text=“here&friend”会导致Alt-F将焦点设置在该框上

我可以显式检查控件类型是否为标签。。。但我还需要群组框和。。。什么?按钮我也应该允许助记符

下面是一些代码(注意,我没有包括选项卡迭代,因为它似乎不相关)

我想我可以做一些像

如果Typeof ctrl是Label或lse,则Typeof ctrl是groupbox(等…)

但是一个属性(或方法)来确定这一点将是非常好的。有什么想法吗

谢谢!
克里斯·伍德拉夫

所以。。。你为什么不让winforms框架为你处理这一切?难道不是相反:如果它不是一个文本框,那么就没关系了?你把它当作“哦,天哪,我无法控制它”。那是个谬论,你当然会。是您设置控件的属性。如果ProcessMnemonic()选择了错误的控件,则为该控件指定了错误的文本属性。如果不是你,那么做的人就在隔壁的隔间里。嘘-我不知道怎么可能?在.net中,选项卡控件无法识别来自其他选项卡的助记符。事情的运作方式是有道理的,只是没有我需要的行为。对不起,我被切断了。。。问题是其他控件、组合框、列表框等。。。它们都具有文本属性,这也可能导致此问题。汉斯-我不明白。IsMnemonic的文本参数只是一个字符串。我本以为微软会做myControl.IsMnemonic(charcode),但事实并非如此。它的sig是静态控件。IsMnemonic(字符码,字符串)
Private Function IsMnemonicInThisContainer(charCode As Char, controlContainer As System.Windows.Forms.Control.ControlCollection) As Boolean

    For Each ctrl As Control In controlContainer

        If Control.IsMnemonic(charCode, ctrl.Text) Then

            If ControlIsAlive(ctrl) Then
                Return True
            End If

        ElseIf ctrl.HasChildren Then

            If ControlIsAlive(ctrl) AndAlso IsMnemonicInThisContainer(charCode, ctrl.Controls) Then
                Return True
            End If

        End If
    Next

    Return False

End Function

Private Function ControlIsAlive(ctrl As Control) As Boolean

    ' In a TABPAGE that is not selected, the controls all appear to be visible = FALSE,
    ' because they aren't actually "visible" - HOWEVER... the control itself may be expecting
    ' to be visible (once it's tab is shown)... so this call to GetStateMethodInfo which I grabbed from
    ' http://stackoverflow.com/questions/3351371/using-control-visible-returns-false-if-its-on-a-tab-page-that-is-not-selected
    ' is the solution I needed. 
    ' Instead of walking the tree though I am going to "check containers" as I drop into them... if they are not enabled/visible
    ' then I'm not going to go any deeper

    ' Is control enabled and going to be shown?  (calling ctrl.visible allows us to bypass the other call if we can!)
    Return (ctrl.Enabled AndAlso (ctrl.Visible OrElse CBool(GetStateMethodInfo.Invoke(ctrl, New Object() {2}))))

End Function