Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF ColumnDefinition Auto Width MinWidth Binding

Tags:

.net

binding

wpf

As I was writing this I found a solution which I will explain below, but for the sake of an academic exercise I was wondering why my original solution didn't work.

I was trying to setup a 3 column <Grid> where the left and right hand columns would auto-size to their content but both have the same width, so the smaller column would expand to match the bigger column. This is what I tried, which seems like it should work:

        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Name="FlagColumn" Width="Auto" MinWidth="{Binding ActualWidth, ElementName=NumberColumn}"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Name="NumberColumn" Width="Auto" MinWidth="{Binding ActualWidth, ElementName=FlagColumn}"/>
            </Grid.ColumnDefinitions>                

            <TextBlock Grid.Column="0" Text="AAAA" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <TextBlock Grid.Column="1" Text="BBBBBBBBBBBBB" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <TextBlock Grid.Column="2" Text="CCCCCCC" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </Grid>

This resulted in the columns auto-sizing but seemingly ignoring the MinWidth binding and just auto sizing to their own content independently.

Just FYI, this is what I ended up doing to make it work:

        <Grid Grid.IsSharedSizeScope="True">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" SharedSizeGroup="Corner"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="Auto" SharedSizeGroup="Corner"/>
            </Grid.ColumnDefinitions>                

            <TextBlock Grid.Column="0" Text="AAAA" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <TextBlock Grid.Column="1" Text="BBBBBBBBBBBBB" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <TextBlock Grid.Column="2" Text="CCCCCCC" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </Grid>
like image 560
Mike Marynowski Avatar asked Nov 24 '25 18:11

Mike Marynowski


1 Answers

Your first solution does work by initializing(one time).

Widths will be later not updated(if you change Text in TextBlocks) because ActualWidth of ColumnDefinition neither DependencyProperty nor does notify about the change (you could update bindings in code behind, but this solution is ugly).

So if you bind to the ActualWidth of TextBlock, then you widths will be adjusted:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Name="FlagColumn" Width="Auto" MinWidth="{Binding ActualWidth, ElementName=tb3}"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Name="NumberColumn" Width="Auto" MinWidth="{Binding ActualWidth, ElementName=tb1}"/>
    </Grid.ColumnDefinitions>

    <TextBlock x:Name="tb1"  Grid.Column="0" Text="AAAA" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    <TextBlock Grid.Column="1" Text="BBBBBBBBBBBBB" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    <TextBlock x:Name="tb3" Grid.Column="2" Text="CCCCCCC" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>

Moreover your side columns will not shrink in case text in column will be shorter despite Auto-size less than MinWidth set from previous values, hence new widths can only grow.

like image 198
Rekshino Avatar answered Nov 26 '25 17:11

Rekshino



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!