我想以编程方式配置wpf网格。
我希望能够设置一个包含2列的网格,第一列占用可用空间的20%,第二列占80%。在xaml中我会使用*运算符,但我无法解决如何以编程方式执行此操作。
在Xaml中我会这样做:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition width="20*" />
<ColumnDefinition width="80*" />
</Grid>
在我想要的代码中:
Grid grid = new Grid();
grid.ColumnDefinitions.Add( new ColumnDefinition(20*) );
grid.ColumnDefinitions.Add( new ColumnDefinition(80*) );
请有人建议。
答案 0 :(得分:84)
Grid grid = new Grid();
ColumnDefinition c1 = new ColumnDefinition();
c1.Width = new GridLength(20, GridUnitType.Star);
ColumnDefinition c2 = new ColumnDefinition();
c2.Width = new GridLength(80, GridUnitType.Star);
grid.ColumnDefinitions.Add(c1);
grid.ColumnDefinitions.Add(c2);
答案 1 :(得分:15)
假设您在页面中有一些按钮(水平对齐),需要根据某些状态隐藏/显示某些按钮。
<Grid HorizontalAlignment="Center" Grid.Column="1" Width="340" VerticalAlignment="Center" Background="Transparent">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*" x:Name="colOne"></ColumnDefinition>
<ColumnDefinition Width="0" x:Name="colTwo"></ColumnDefinition>
<ColumnDefinition Width="0" x:Name="colThree"></ColumnDefinition>
<ColumnDefinition Width="0" x:Name="colFour"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button x:Name="btnOne" Grid.Column="0" Height="50" Width="50" Content="One" Cursor="Hand" />
<Button x:Name="btnTwo" Grid.Column="1" Height="50" Width="50" Content="Two" Cursor="Hand" />
<Button x:Name="btnThree" Grid.Column="2" Height="50" Width="50" Content="Thre" Cursor="Hand" />
<Button x:Name="btnFour" Grid.Column="3" Height="50" Width="50" Content="Four" Cursor="Hand" />
</Grid>
这里btnOne在执行时会在页面中显示。 btnOne也将在中心对齐。现在,如果我们想要显示Three和Four,并且当单击One时隐藏One,我们可以使用此代码:
private void btnOne_Click(object sender, RoutedEventArgs e)
{
SetGridColWidth(colOne, false);
SetGridColWidth(colThree, true);
SetGridColWidth(colFour, true);
}
private void SetGridColWidth(ColumnDefinition column, bool show)
{
if (show)
column.Width = new GridLength(2, GridUnitType.Star);
else
column.Width = new GridLength(0);
}
您可以在运行时切换任何按钮的可见性。
希望这有助于某人!
答案 2 :(得分:4)
In MVVM way:
------------
*XAML(View) code:*
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding FirstColumn}"/>
<ColumnDefinition Width="{Binding SecondColumn}"/>
</Grid.ColumnDefinitions>
</Grid>
**ViewModel (C#) code**
public class MyViewModel : BindableBase
{
private GridLength _firstColumn;
private GridLength _secondColumn;
public MyViewModel()
{
_firstColumn = new GridLength(75, GridUnitType.Star);
_secondColumn = new GridLength(25, GridUnitType.Star);
}
public GridLength FirstColumn
{
get { return _firstColumn; }
set { SetProperty(ref _firstColumn, value); }
}
public GridLength SecondColumn
{
get { return _secondColumn; }
set { SetProperty(ref _secondColumn, value); }
}
private void NotifyToggleFullScreen(bool isToggleExpansion)
{
if (isToggleExpansion)
{
FirstColumn = new GridLength(0, GridUnitType.Auto);
SecondColumn = new GridLength(100, GridUnitType.Star);
}
else
{
FirstColumn = new GridLength(75, GridUnitType.Star);
SecondColumn = new GridLength(25, GridUnitType.Star);
}
}
}
答案 3 :(得分:1)
您可以使用自动:
var c1 = new ColumnDefinition() { Width = GridLength.Auto };