c# - 从哪里开始在 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;
}
}
}
}
非常感谢!
解决方案
我认为您在表单显示之前运行代码是正确的。(通过在 for 循环上放置断点很容易检查)
您可以使用表单的 Loaded 事件。把它放在你的 XAML 中作为窗口
Loaded="MainWindowView_OnLoaded"
这在你的 C#
private void MainWindowView_OnLoaded(object sender, RoutedEventArgs e)
{
addButtonGrp();
}
当您知道堆栈面板的高度时,这应该在显示表单后触发。
推荐阅读
- python - 如何测量下一个按键之间的时间?
- text - AFRAME 文本几何组件从中心旋转?
- android - Android:重复功能,直到按下按钮
- batch-file - .Bat 脚本不会立即更改桌面壁纸
- django - Django 在提交时关闭引导模式
- java - 是否可以构建一个使用 SSL/TLS JAVA_OPTS 作为其 SSLContext 的 Java 11 HttpClient?
- image-processing - 检测照片是 2d(例如来自屏幕、杂志)还是 3d(物体的真实照片)
- c# - SendAsync 上的代码 500 内部服务器错误
- typescript - 使用 TypeScript 装饰器扩展 ES6 类时扩展类型
- reactjs - useReducer Action 分派了两次