У меня есть приложение (.net framework 4, vb.net), которое изначально было приложением VB6.Чтобы имитировать части старого поведения элемента управления вкладками, я использую клавиши ускорения, которые позволяют переключаться на другую вкладку.Пример - TabControl с 5 вкладками.- Вкладка 2 имеет метку & Данные (ускоритель alt-d) с текстовым полем. - Пользователь выбрал вкладку 1 и нажимает alt-d, в результате чего элемент управления вкладкой выбирает вкладку 2 и устанавливает фокус на соответствующее текстовое поле.
Я написал некоторый код, который ищет вкладку, содержащую элемент управления (я делаю это путем переопределения ProcessMnemonic), и просто просматриваю вкладки (начиная с выбранной), и если я нахожу совпадение, я выбираю вкладку, затем разрешаюсистема для обработки мнемоники путем вызова «MyBase.ProcessMnemonic (charCode)».
Но моя проблема заключается в вызове Control.IsMnemonic.Поскольку вы передаете «Text» только элементу управления, любой элемент управления, содержащий & в его текстовом свойстве, может привести к совпадению.
Например, myTextbox.Text = "here & friend" заставит Alt-F установить фокус на этом поле.
Я могу явно проверить, является ли тип элемента управления меткой ... нотогда мне также нужны групповые ящики и ... что?Кнопки Я также должен разрешить мнемонику ...
Вот некоторый код (заметьте, я не включил итерацию табуляции, так как она не показалась мне подходящей);
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
' /3210065/ispolzovanie-control-visible-vozvraschaet-znachenie-false-esli-ono-nahoditsya-na-vkladke-kotoraya-ne-vybrana
' 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
Полагаю, яможет сделать что-то вроде ...
Если Typeof Ctrl равен Label orelse Typeof Ctrl равен groupbox (и т. д.) ...
Но свойство (или метод) для определения этого будетотличный.Есть идеи?
Спасибо!Крис Вудрафф