Что именно является аргументом "Ctrl" в обработчике кликов для CommandBarButton?
Я недавно исправил, работал над очень раздражающей проблемой в моей базе кода.
у меня есть ParentMenuItemBase
абстрактный класс, из которого я получаю классы, которые по существу обернуть CommandBarPopup
контролировать и создать ребенка CommandBarButton
объекты и подключить их Click
событие для выполнения ICommand
,
Скажи, что у меня был RefactorRenameCommand
подключил до 5 полностью независимых CommandBarButton
объекты до 5 лет совершенно не связаны CommandBarPopup
управления.
Когда я нажал CommandBarButton
, child_Click
обработчик будет работать 5 раз - и Ctrl
Параметр будет иметь одинаковый хэш-код для всех 5 "кликов".
Затем, если я снова нажму ту же кнопку, обработчик снова запустится 5 раз, и снова Ctrl
параметр будет иметь одинаковый хеш-код для всех 5 "кликов", но хеш-код будет отличаться от того, который был в первый раз - и если бы я нажал снова, я получил бы новый хеш-код для этого параметра,
Я получил желаемое поведение, сохранив последний хэш-код для этого Ctrl
параметр в private static
поле, и только выполнение обработчика, если хэш-код для Ctrl
было иначе - другими словами, я заставил это работать, основываясь на наблюдаемом поведении, которое я не полностью понял, и это чувствует себя грязным, и это беспокоит меня вне слов. Вот такой взлом, включая фактические комментарии в коде:
// note: HAAAAACK!!!
private static int _lastHashCode;
private void child_Click(CommandBarButton Ctrl, ref bool CancelDefault)
{
var item = _items.Select(kvp => kvp.Key).SingleOrDefault(menu => menu.Key == Ctrl.Tag) as ICommandMenuItem;
if (item == null || Ctrl.GetHashCode() == _lastHashCode)
{
return;
}
// without this hack, handler runs once for each menu item that's hooked up to the command.
// hash code is different on every frakkin' click. go figure. I've had it, this is the fix.
_lastHashCode = Ctrl.GetHashCode();
Debug.WriteLine("({0}) Executing click handler for menu item '{1}', hash code {2}", GetHashCode(), Ctrl.Caption, Ctrl.GetHashCode());
item.Command.Execute(null);
}
Тот Debug.WriteLine
вызов будет выводить что-то вроде этого:
(46595510) Executing click handler for menu item '&Rename', hash code 16706408 (16139946) Executing click handler for menu item '&Rename', hash code 16706408 (11041789) Executing click handler for menu item '&Rename', hash code 16706408 (32267243) Executing click handler for menu item '&Rename', hash code 16706408 (21969731) Executing click handler for menu item '&Rename', hash code 16706408
И следующий щелчок выдаст идентичный вывод, за исключением другого хеш-кода для Ctrl
параметр.
Итак, что именно это Ctrl
параметр? Если это CommandBarButton
COM-элемент управления, по которому был выполнен щелчок, и почему его хеш-код не совпадает с CommandBarButton
объект, который я создал? И почему его хэш-код меняется каждый раз, когда запускается обработчик?