WinUI3如何通过代码为StackPanel中的TextBox设置星号单位宽度?
解决方案:用Grid替代StackPanel实现星号比例布局
StackPanel本身不支持星号(*)这种比例分配空间的布局逻辑,星号是Grid控件的ColumnDefinition专属特性。直接用Grid替换Horizontal方向的StackPanel,就能轻松实现你要的效果,还能自动处理窗口Resize,无需手动计算宽度。
具体实现步骤
- 创建Grid控件,替代原有的Horizontal StackPanel
- 为Grid添加对应数量的ColumnDefinition,设置每个列的Width为Star类型的GridLength
- 将TextBox添加到Grid中,并通过附加属性指定其所在的列
C++/WinRT代码示例
// 创建Grid(默认按列排列,对应原StackPanel的Horizontal方向) Grid grid; // 定义列的比例:第一列占2份,后两列各占1份 ColumnDefinition col1; col1.Width(GridLengthHelper::FromValueAndType(2, GridUnitType::Star)); ColumnDefinition col2; col2.Width(GridLengthHelper::FromValueAndType(1, GridUnitType::Star)); ColumnDefinition col3; col3.Width(GridLengthHelper::FromValueAndType(1, GridUnitType::Star)); grid.ColumnDefinitions().Append(col1); grid.ColumnDefinitions().Append(col2); grid.ColumnDefinitions().Append(col3); // 创建三个TextBox并指定所在列 TextBox text1; text1.Text(L"Text1"); Grid::SetColumn(text1, 0); TextBox text2; text2.Text(L"Text2"); Grid::SetColumn(text2, 1); TextBox text3; text3.Text(L"Text3"); Grid::SetColumn(text3, 2); // 将TextBox添加到Grid grid.Children().Append(text1); grid.Children().Append(text2); grid.Children().Append(text3); // 最后将Grid添加到窗口或父容器中
为什么不用StackPanel?
StackPanel是流式布局控件,只会根据子元素的期望大小依次排列,不会自动分配剩余空间。而Grid的列定义天生支持Star单位的比例分配,窗口Resize时会自动重新计算各列宽度,完全不需要手动处理尺寸变化事件。
内容的提问来源于stack exchange,提问作者Vicente Flich
相关产品推荐
相关产品推荐

