Как создать кнопку после ввода ее данных в другом окне WPF - PullRequest
0 голосов
/ 07 августа 2020

Контекст: у меня есть два windows: одно - это главное окно, в котором я создаю новую кнопку и добавляю ее в StackPanel. Моя цель - создать программу, которая, когда вы вводите некоторые данные (например, заголовок, группу и изображение) в другое окно, эти параметры go в главное окно и используются для создания новой кнопки.

Код:

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    // Click event of the accept button

    string tituloHabilidad = Convert.ToString(tituloBox.Text);
    string grupoHabilidad = Convert.ToString(claseBox.Text);
    int nivelHabilidad = Convert.ToInt32(nivelBox.Text);
    this.tituloHabilidad = tituloHabilidad;
    this.grupoHabilidad = grupoHabilidad;
    this.nivelHabilidad = nivelHabilidad;
    tituloBox.Text = "";
    claseBox.Text = "";
    nivelBox.Text = "";
    //menu.crearBoton(tituloHabilidad, grupoHabilidad, nivelHabilidad, nuestroIcono);
    this.Visibility = Visibility.Hidden; 
}

private void bHabilidades_Copy_Click(object sender, RoutedEventArgs e)
    {
        //vent is the calling of the entering data window
        vent.Show();
        //The retorno methods are simply the getters for the parameters of the button
        ImageBrush nuestroIcono = vent.retornoIcono();
        string tituloHabilidad = vent.retornoTitulo();
        string grupoHabilidad = vent.retornoGrupo();
        int nivelHabilidad = vent.retornoNivel();
        //This method below is the method that creates buttons. The parameters are the data introduced in the entering data button
        crearBoton(tituloHabilidad, grupoHabilidad, nivelHabilidad, nuestroIcono);
    }
         //The crearBoton method adds it to the stackPanel
        

Проблема: когда я нажимаю кнопку «принять», которая делает окно ввода данных невидимым, а затем я вызываю метод, который создает новую кнопку (в главном окне), создается пустая кнопка, и если я ввожу новые данные в окно ввода данных, новая созданная кнопка фактически имеет правильные данные (но это старые данные, поэтому они не соответствуют фактическому запросу)

Как должно выглядеть решение: Я думаю, мне нужно условное выражение «if» для запуска метода кнопки создания после метода получения данных. Однако я принимаю любое решение, которое вы примете, если код работает.

1 Ответ

0 голосов
/ 07 августа 2020

vent.Show ()

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

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    // Click event of the accept button

    //string tituloHabilidad = Convert.ToString(tituloBox.Text);
    //string grupoHabilidad = Convert.ToString(claseBox.Text);
    //int nivelHabilidad = Convert.ToInt32(nivelBox.Text);
    //this.tituloHabilidad = tituloHabilidad; // basically setting this.x = x; does nothing
    //this.grupoHabilidad = grupoHabilidad;
    //this.nivelHabilidad = nivelHabilidad;
    //tituloBox.Text = "";
    //claseBox.Text = "";
    //nivelBox.Text = "";
    //menu.crearBoton(tituloHabilidad, grupoHabilidad, nivelHabilidad, nuestroIcono);
    this.DialogResult = true;
}

private void bHabilidades_Copy_Click(object sender, RoutedEventArgs e)
    {
        //vent is the calling of the entering data window
        // Here is something you need to decide :
        // 1. You create new vent dialog and show it, e.g.
        // var vent = new YourWindowName(); // I recommend personally
        // or 2. set dialogresult to null, but dialog will have prefilled data from before (if dialog was used previously)
        // vent.DialogResult=null;

        if(vent.ShowDialog() == true)
        {
            //The retorno methods are simply the getters for the parameters of the button
            ImageBrush nuestroIcono = vent.retornoIcono();
            string tituloHabilidad = vent.retornoTitulo();
            string grupoHabilidad = vent.retornoGrupo();
            int nivelHabilidad = vent.retornoNivel();
            //This method below is the method that creates buttons. The parameters are the data introduced in the entering data button
            crearBoton(tituloHabilidad, grupoHabilidad, nivelHabilidad, nuestroIcono);
        }
    }
         //The crearBoton method adds it to the stackPanel

По сути, он будет ждать, пока результат диалога станет истинным, и только после этого переходить к созданию кнопки. Если, например, у вас есть кнопка отмены при вводе информационного окна

private void Button_Cancel_Click(object sender, RoutedEventArgs e)
{
    // Click event of the cancel button
    this.DialogResult=false;
}

, тогда диалоговое окно закроется, но кнопка не будет создана.

Изменить: после некоторых вопросов, которые вы подняли, я знаю, где актуальная проблема. Методы retornoIcono(), retornoTitulo() и retornoNivel(), скорее всего, просто возвращают tituloBox.Text, claseBox.Text и nivelBox.Text. Поскольку вы устанавливаете их значения в локальных переменных и после этого очищаете textbox.text, он всегда давал вам значение empty.string (или ''). Чтобы исправить это, есть несколько способов:

  1. закомментировать строки, очищающие текстовые поля (как я сделал выше, но это плохая практика, даже если она работает);
  2. создайте частные переменные в классе окна / формы и соответствующим образом настройте методы (или, если хотите, просто установите для них publi c и полностью избавьтесь от методов), например

Пример варианта 2: частные переменные / publi c методы

public class YouWindowName
{
private string tituloHabilida, grupoHabilidad;
private int nivelHabilidad;

private void Button_Click_1(object sender, RoutedEventArgs e)
{
<...snip...>
tituloHabilidad = Convert.ToString(tituloBox.Text);
grupoHabilidad = Convert.ToString(claseBox.Text);
nivelHabilidad = Convert.ToInt32(nivelBox.Text);
<...snip...>
}

public string retornoTitulo()
{
return tituloHabilidad;
}
// do other analogically
...