У меня есть приложение (.net framework 4, vb.net), которое изначально было приложением VB6. Чтобы имитировать части старого поведения управления вкладками, я реализую клавиши быстрого доступа, которые позволяют вам переключаться на другую вкладку. Пример — TabControl с 5 вкладками. - Вкладка 2 имеет метку &Data (ускоритель alt-d) с текстовым полем - Пользователь выбрал вкладку 1 и нажимает alt-d, что приводит к тому, что элемент управления вкладкой выбирает вкладку 2 и устанавливает фокус на соответствующее текстовое поле.
Я написал некоторый код, который ищет вкладку, содержащую элемент управления (я делаю это, переопределяя ProcessMnemonic), и просто просматриваю вкладки (начиная с выбранной), и если я нахожу совпадение, я выбираю вкладку, а затем разрешаю системе для обработки мнемоники, вызвав "MyBase.ProcessMnemonic(charCode)".
Но моя проблема связана с вызовом Control.IsMnemonic. Поскольку вы передаете только «текст» элемента управления, любой элемент управления, который содержит & в свойстве text, может привести к совпадению.
Например, myTextbox.Text = "здесь и друг" заставит 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
' 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
Думаю, я мог бы сделать что-то вроде...
Если Typeof ctrl - это Label orelse Typeof ctrl - это групповое поле (и т.д...)...
Но свойство (или метод) для определения этого было бы здорово. Любые идеи?
Спасибо! Крис Вудрафф