Выдает ошибку "данный ключ отсутствует в словаре" при нажатии на Q,W... работают только клавиши от D1 до D0 и backsapace. Вопрос: почему выдает ошибку, вроде же верно все?
public enum Notes
{
Do1, Re1, Mi1, Fa1, Col1, La1, Si1,
Do2, Re2, Mi2, Fa2, Col2, La2, Si2,
Do3, Re3, Mi3, Fa3, Col3, La3, Si3,
Do4, Re4, Mi4, Fa4, Col4, La4, Si4,
Do5, Re5, Mi5, Fa5, Col5, La5, Si5, Do6,
DoSharp1, ReSharp1, FaSharp1, ColSharp1, LaSharp1,
DoSharp2, ReSharp2, FaSharp2, ColSharp2, LaSharp2,
DoSharp3, ReSharp3, FaSharp3, ColSharp3, LaSharp3,
DoSharp4, ReSharp4, FaSharp4, ColSharp4, LaSharp4,
DoSharp5, ReSharp5, FaSharp5, ColSharp5, LaSharp5
}
private Dictionary<Notes, MediaPlayer> sounds = new Dictionary<Notes, MediaPlayer>();
private Dictionary<Keys, bool> pressStates = new Dictionary<Keys, bool>();
private Dictionary<Keys, Notes> KeySounds = new Dictionary<Keys, Notes>
{
{ Keys.D1, Notes.Do1 },
....
//для каждой ноты перечисления Notes задаем клавишу клавиатуры
....
{ Keys.NumPad9, Notes.LaSharp5 }
};
private void Form1_Load(object sender, EventArgs e)
{
//Инициализируем словари
foreach (Notes s in Enum.GetValues(typeof(Notes)).Cast<Notes>())
{
sounds.Add(s, new MediaPlayer());
pressStates.Add((Keys)s, false);
}
//Наполняем словарь звуками
sounds[Notes.Do1].Open(new Uri("s//_1.wav", UriKind.Relative));
....
//Для каждой ноты задаем звуковой файл
....
sounds[Notes.LaSharp5].Open(new Uri("s//25.wav", UriKind.Relative));
}
private void Form1_KeyDown(Object sender, KeyEventArgs e)
{
if (!KeySounds.ContainsKey(e.KeyCode)) return;
if (!pressStates[e.KeyCode])
{
pressStates[e.KeyCode] = true;
PlaySound(KeySounds[e.KeyCode]);
}
}
private void Form1_KeyUp(Object sender, KeyEventArgs e)
{
if (!KeySounds.ContainsKey(e.KeyCode)) return;
if (pressStates[e.KeyCode])
{
pressStates[e.KeyCode] = false;
StopSound(KeySounds[e.KeyCode]);
}
}
Ошибка тут:
//Инициализируем словари
foreach (Notes s in Enum.GetValues(typeof(Notes)).Cast<Notes>())
{
sounds.Add(s, new MediaPlayer());
pressStates.Add((Keys)s, false);
}
Значения из перечисления Notes могут быть приведены к значениям Keys, потому что оба перечисления основаны на типе int. Компилятор считает что вы понимаете что делаете, раз используете явное приведение и оно может быть выполнено без ошибок. Однако это ни коим образом не гарантирует, что числовые коды ваших нот будут совпадать с кодами клавиш. которые вы хотите использовать.
Для исправления, разделите на два независимых цикла, например так:
//Инициализируем словарь нот
foreach (Notes s in Enum.GetValues(typeof(Notes)).Cast<Notes>())
{
sounds.Add(s, new MediaPlayer());
}
//Инициализируем словарь состояний клавиш
foreach (Keys k in KeySounds.Keys)
{
pressStates.Add(k, false);
}
или можно даже в одном цикле, но тогда вот так:
//Инициализируем словари
foreach (var s in KeySounds)
{
sounds.Add(s.Key, new MediaPlayer());
pressStates.Add(s.Value, false);
}
Продвижение своими сайтами как стратегия роста и независимости