Programaticamente definir a largura de uma coluna da grelha com * em WPF

quero programaticamente configurar uma grelha wpf.

quero ser capaz de definir uma grelha com 2 colunas, a primeira ocupando 20% do espaço disponível, a segunda ocupando 80%. Em xaml eu usaria o operador * mas eu não posso trabalhar fora como fazer este programaticamente.

em Xaml eu faria:

<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition width="20*" />
    <ColumnDefinition width="80*" />
</Grid>

em código quero fazer:

Grid grid = new Grid();
grid.ColumnDefinitions.Add( new ColumnDefinition(20*) );
grid.ColumnDefinitions.Add( new ColumnDefinition(80*) );
Por favor, alguém pode aconselhar.

 27
Author: Omri Btian, 2012-03-21

3 answers

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);
 77
Author: Klaus78, 2012-03-21 11:36:38

Suponha que tem alguns botões (alinhados horizontalmente) numa página e precisa de esconder / mostrar alguns, dependendo de algum estado.

<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>

Aqui o btnOne estará visível na página quando for executado. o btnOne também estará alinhado no centro. Agora, se quisermos que três e quatro sejam exibidos e um seja escondido quando clicado em um, Podemos usar este código:

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);
}

Pode alternar entre a visibilidade de qualquer botão à hora de execução.

Espero que isto ajude alguém !
 14
Author: Venugopal M, 2015-03-13 08:12:30
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);
        }
    }
}
 2
Author: Sathya Ram, 2017-01-16 11:59:33