我正在尝试创建一个“KeySet”来修改 UIElement 行为。这个想法是创建一个特殊的功能,例如。用户在按住 a 的同时单击一个元素。或者 ctrl+a。
到目前为止,我的方法首先让我们为所有可能的修饰符创建一个容器。如果我只允许一个键,那将没有问题。我可以使用一个简单的字典,
Dictionary<Keys, Action> _specialActionList
- 如果字典为空,则使用默认操作。
- 如果有条目,请根据当前按下的键检查要使用的操作
如果我不贪心,那就是……当然,我想要更多。我想允许多个键或修饰符。所以我创建了一个包装类,它可以用作我的字典的键。
使用更复杂的类时有一个明显的问题。目前两个不同的实例会创建两个不同的键,因此他永远不会找到我的函数(看代码来理解,真的很明显)
现在我检查了这篇文章:GetHashCode override of object contains generic array这有点帮助。
但我的问题是,我的课程的基本设计还可以吗?我应该使用哈希集来存储修饰符和普通键盘键(而不是列表)。如果是这样,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);
}
}