Что именно является аргументом "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 объект, который я создал? И почему его хэш-код меняется каждый раз, когда запускается обработчик?

0 ответов

Другие вопросы по тегам