С чего начать генерацию кнопок в форме WPF - PullRequest
0 голосов
/ 16 октября 2018

У меня есть форма WPF с сеткой и внутри этой сетки в строке (1). Столбец (1) у меня есть StackPanel.Внутри этой StackPanel я хочу генерировать кнопки.

Я не знаю, сколько кнопок будет сгенерировано, поскольку форма (с сеткой и stackPanel) может быть разного размера.

Код ниже работает, кнопки генерируются, если я запускаю этот кусок кода на Button_Click, например.

Но кнопки не генерируются, если я запускаю этот кусок кода после InitializeComponent ().

Я предполагаю, чтопосле того, как InitializeComponent WPF форма все еще не прорисована (или закончила загрузку), поэтому мой stPanel.ActualHeigh == "0", и, поскольку я не могу делить на ноль, ничего не происходит.

Можете ли вы предложить какой-то обходной путь, илиеще лучшее правильное решение?

       public partial class frmReceipt : Window
    {
        public frmReceipt()
        {
            InitializeComponent();
            addButtonGrp(); //am i too fast :)
        }


        private void addButtonGrp()
        {

            //Calculate size of container to determine numbers of button
            int btnMinimumHeightSize = 30;

            int btnNumberCreated = (Convert.ToInt16(stPanel.ActualHeight) / btnMinimumHeightSize);

            for (int i = 0; i < btnNumberCreated; i++)
            {

                CreateGroupButtons btn = new CreateGroupButtons();
                var btnX = new Button();

                btnX = (btn.addButton(i, btnMinimumHeightSize, Convert.ToInt16(stPanel.ActualWidth)));
                btnX.Click += ClickHandlerGrp;

                if (i == btnNumberCreated - 1)
                {
                    btnX.Height = btnMinimumHeightSize + ((Convert.ToDouble(stPanel.ActualHeight) / btnMinimumHeightSize) % 1) * (btnNumberCreated);
                }

                stPanel.Children.Add(btnX);
            }
        }



        private void ClickHandlerGrp(object sender, RoutedEventArgs e)
        {
            var button = sender as Button;
            MessageBox.Show("Clicked button number: " + button.Tag);

            string test = Convert.ToString(button.Tag);

            switch (test)
            {
                case "PLUGrp":
                    addButtonGrp(); //this is just for test, i don't want to generate buttons this way
                    break;
                default:
                    break;
            }


        }


    }
}

Большое спасибо!

1 Ответ

0 голосов
/ 16 октября 2018

Я думаю, что вы правы в запуске кода до отображения формы.(Это было бы легко проверить, поместив точку останова в цикл for)

Вы можете использовать событие Loaded формы.Поместите это в свой XAML для окна

Loaded="MainWindowView_OnLoaded"

и это в вашем C #

    private void MainWindowView_OnLoaded(object sender, RoutedEventArgs e)
    {
        addButtonGrp();
    }

Это должно сработать после отображения формы, когда вы знаете высоту панели стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...