Как заставить PictureBoxes измениться с видимого на невидимый в зависимости от ввода пользователя? - PullRequest
0 голосов
/ 07 мая 2018

Я делаю приложение Enigma Simulator в C #. В дополнение к этому я пытаюсь сделать его лайтборд, который в основном представляет собой клавиатуру, которая подсвечивает букву, возвращаемую отражателем. Теперь моя идея состояла в том, чтобы добавить 26 коробок с желтыми изображениями букв и сверху каждой из них добавить 26 других коробок с серыми изображениями букв.

Серые - это те, которые видны, если пользователь набрал 0 букв. Когда пользователь печатает букву, загадка декодирует ее и возвращает другую, основываясь на ее настройках, и эта буква должна включиться на клавиатуре (желтое изображение буквы), затем она выключается (серое изображение), когда приходит следующая буква.

Код ниже - это часть, которая показывает, как я пытался это сделать, но я не могу понять, как заставить их работать один за другим, не все сразу. Любая помощь или совет, как добиться этого эффекта будет приветствоваться.

 StringBuilder ciphertext = new StringBuilder(txtCiphertext.Text);
        int i = 0;
        while (i < ciphertext.Length)
        {
            if (ciphertext[i] == (char)Keys.A)
            {
                Aoff.Visible = false;
                Aon.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.B)
            {
                Boff.Visible = false;
                Bon.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.C)
            {
                Coff.Visible = false;
                Con.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.D)
            {
                Doff.Visible = false;
                Don.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.E)
            {
                Eoff.Visible = false;
                Eon.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.F)
            {
                Foff.Visible = false;
                Fon.Visible = true;


            }
            else if (ciphertext[i] == (char)Keys.G)
            {
                Goff.Visible = false;
                Gon.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.H)
            {
                Hoff.Visible = false;
                Hon.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.I)
            {
                Ioff.Visible = false;
                Ion.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.J)
            {
                Joff.Visible = false;
                Jon.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.K)
            {
                Koff.Visible = false;
                Kon.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.L)
            {
                Loff.Visible = false;
                Lon.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.M)
            {
                Moff.Visible = false;
                Mon.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.N)
            {
                Noff.Visible = false;
                Non.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.O)
            {
                Ooff.Visible = false;
                Oon.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.P)
            {
                Poff.Visible = false;
                Pon.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.Q)
            {
                Qoff.Visible = false;
                Qon.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.R)
            {
                Roff.Visible = false;
                Ron.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.S)
            {
                Soff.Visible = false;
                Son.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.T)
            {
                Toff.Visible = false;
                Ton.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.U)
            {
                Uoff.Visible = false;
                Uon.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.V)
            {
                Voff.Visible = false;
                Von.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.W)
            {
                Woff.Visible = false;
                Won.Visible = true;

            }

            else if (ciphertext[i] == (char)Keys.X)
            {
                Xoff.Visible = false;
                Xon.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.W)
            {
                Woff.Visible = false;
                Won.Visible = true;

            }
            else if (ciphertext[i] == (char)Keys.Z)
            {
                Zoff.Visible = false;
                Zon.Visible = true;

            }






            i++;
        }

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Это не целое решение, я просто выхожу на правильный путь, чтобы говорить.

Вы можете использовать keyPress Event текстового поля, чтобы захватить клавишу, которая была нажата, когда пользователь печатает.

Нам понадобится словарь для хранения картинки, серого img и желтого img, с ключевым значением типа char, которое будет символом, который пользователь введет в текстовое поле

Итак, мы собираемся объявить это так:

Dictionary<char, Tuple<PictureBox, string, string>> List = new 
         Dictionary<char, Tuple<PictureBox, string, string>>();

Затем, когда форма загружается, вы читаете изображения из их каталога и заполняете списки, и в то же время читаете все имеющиеся у нас картинки-боксы и добавляете их в словарь.

Я использовал groupBox, чтобы сгруппировать элементы управления PictureBox вместе, чтобы сделать цикл.

Я предполагаю, что фотографии названы по ключу.

private void Form9_Load(object sender, EventArgs e)
{
    //Reading both  yellow and grey Imgs
    string[] grey = Directory.GetFiles(@"C:\greyImgs");
    string[] yellow = Directory.GetFiles(@"C:\yellowImgs");

    //looping thought the controls in the groupbox which are PictureBoxs
    for (int i = 0; i < groupBox1.Controls.Count; i++)
    {
        // Casting the controls as PictureBox
        PictureBox pic = groupBox1.Controls[i] as PictureBox;

        // Adding the grey imgs to PictureBoxx
        pic.ImageLocation = grey[i];

         // Populating the Dictionary
        List.Add(Path.GetFileNameWithoutExtension(grey[i])[0], new Tuple<PictureBox, string, string>(pic, grey[i], yellow[i]));
    }
}

Теперь после этого мы добавляем текстовое поле в форму, и щелкаем правой кнопкой мыши на его свойствах, затем нажимаем на иконку осветительной лампочки, прокручиваем вниз, пока не увидим двойной щелчок по ней. Теперь обработчик событий создан для нажатия клавиши.

поэтому вы положили этот код:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    // e.keychar returns the key that the user pressed
    // So we Don't want the user to press a key we don't have so we perform a check 
    if (List.ContainsKey(e.KeyChar))
    {
        // Here we get the first item of the tuple which is the picturebox
        // and we assign the yellow img being the third item in the tuple.
        List[e.KeyChar].Item1.ImageLocation = List[e.KeyChar].Item3;
    } 
}

Надеюсь, это сработает.

0 голосов
/ 07 мая 2018

Вы можете проверить ввод пользователя, когда он печатает с событием KeyPress. Когда пользователь нажал клавишу, это событие вызывается, и функция обрабатывает событие, и выполняется код внутри этой функции. Также вы можете использовать switch вместо кратных if операторов.

Сначала создайте функцию обработчика:

private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    switch (e.KeyChar)
    {
        case 'A':
            Aoff.Visible = false;
            Aon.Visible = true;
            break;

        case 'B':
            Boff.Visible = false;
            Bon.Visible = true;
            break; 

        ...
    }
}

Тогда вам нужно связать функцию с TextBox.

Если вы сделаете это, когда пользователь нажмет клавишу на TextBox, эта функция будет выполнена, и она будет делать то, что вам нужно.

Я оставил здесь несколько страниц, которые вы можете увидеть, чтобы получить больше информации о мой ответ:

Событие Control.KeyPress

Свойство KeyPressEventArgs.KeyChar

...