首页 > 解决方案 > 从哪里开始在 WPF 表单上生成按钮

问题描述

我有带有 Grid 的 WPF 表单,在 Row(1).Column(1) 的那个 Grid 里面我有 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;
            }


        }


    }
}

非常感谢!

标签: c#wpf

解决方案


我认为您在表单显示之前运行代码是正确的。(通过在 for 循环上放置断点很容易检查)

您可以使用表单的 Loaded 事件。把它放在你的 XAML 中作为窗口

Loaded="MainWindowView_OnLoaded"

这在你的 C#

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

当您知道堆栈面板的高度时,这应该在显示表单后触发。


推荐阅读