Я пытаюсь создать KeySet для изменения поведения UIElement. Идея состоит в том, чтобы создать специальную функцию, если, например. пользователь нажимает на элемент, удерживая. Или ctrl + a.
Мой подход пока что сначала - создать контейнер для всех возможных модификаторов. Если бы я просто разрешил один ключ, это не было бы проблемой. Я мог бы использовать простой словарь, с
Dictionary<Keys, Action> _specialActionList
- Если словарь пуст, используйте действие по умолчанию.
- Если есть записи, проверьте, какое действие использовать в зависимости от текущих нажатых клавиш
И если бы я не был жадным, это было бы ...
Теперь, конечно, я хочу больше. Я хочу разрешить несколько ключей или модификаторов. Поэтому я создал класс-оболочку , который можно использовать в качестве ключа к моему словарю.
Существует очевидная проблема при использовании более сложного класса. В настоящее время два разных экземпляра создадут два разных ключа, и поэтому он никогда не найдет мою функцию (см. Код, чтобы понять, действительно очевидно)
Теперь я проверил этот пост: Переопределение GetHashCode объекта, содержащего универсальный массив , что немного помогло.
Но мой вопрос в том, в порядке ли мой базовый дизайн для класса. Должен ли я использовать хэш-набор для хранения модификатора и обычных клавиш клавиатуры (вместо списков). И если да, то как будет выглядеть функция GetHashCode?
Я знаю, много кода для написания (скучные хэш-функции), некоторых советов было бы достаточно, чтобы начать. Опубликуйте здесь испытания ...
А вот и код, тест явно провалился ...
public class KeyModifierSet
{
private readonly List<Key> _keys = new List<Key>();
private readonly List<ModifierKeys> _modifierKeys = new List<ModifierKeys>();
private static readonly Dictionary<KeyModifierSet, Action> _testDict
= new Dictionary<KeyModifierSet, Action>();
public static void Test()
{
_testDict.Add(new KeyModifierSet(Key.A), () => Debug.WriteLine("nothing"));
if (!_testDict.ContainsKey(new KeyModifierSet(Key.A))) throw new Exception("Not done yet, help :-)");
}
public KeyModifierSet(IEnumerable<Key> keys, IEnumerable<ModifierKeys> modifierKeys)
{
foreach (var key in keys)
_keys.Add(key);
foreach (var key in modifierKeys)
_modifierKeys.Add(key);
}
public KeyModifierSet(Key key, ModifierKeys modifierKey)
{
_keys.Add(key);
_modifierKeys.Add(modifierKey);
}
public KeyModifierSet(Key key)
{
_keys.Add(key);
}
}