Выдает ошибку "данный ключ отсутствует в словаре" при нажатии на 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);
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Возможно ли разработать приложение, которое предложит поля для загрузки собственных спрайтов пользователю? При загрузке спрайтов, они "привязываются"...
Будет ли работать данная технология при передачи данных из/в приложение C# windows и Ubuntu находящейся внутри Virtual Box
Есть тяжелый UI внутри окна, пока он рендерится зависает все окно, как можно рендерить UI асинхронно, при этом не блокируя весь UI окнаМои мысли...