Как я могу сделать так, чтобы мои столбцы сетки всегда были одинаковой ширины? - PullRequest
6 голосов
/ 26 сентября 2011

Если я установлю ширину столбца на *, изначально они будут одинаковой ширины, но если элемент будет больше, чем допустимое количество, он будет растягивать ширину столбца.

Как я могу заставитьСетка, чтобы сохранить ее столбцы одинакового размера с явным определением размера?

Я не могу использовать UniformGrid, потому что эта Сетка используется в ItemsControl, и Предметы должны быть помещены в определенный Grid.Row / Grid.Column spot

Edit Вот пример моего текущего кода.

<DockPanel>

    <!-- Not showing code here for simplicity -->
    <local:ColumnHeaderControl DockPanel.Dock="Top" />
    <local:RowHeaderControl DockPanel.Dock="Left" />

    <ItemsControl ItemsSource="{Binding Events}">
        <ItemsControl.ItemContainerStyle>
            <Style>
                <Setter Property="Grid.Column" 
                        Value="{Binding DueDate.DayOfWeek, 
                            Converter={StaticResource EnumToIntConverter}}" />
            </Style>
        </ItemsControl.ItemContainerStyle>

        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                </Grid>
            </ItemsPanelTemplate>
        </ItemsPanel>
    </ItemsControl>

</DockPanel>

Правка # 2 Вот мое окончательное решение.Это делает столбцы правильного размера, и он сохраняет правильный размер при изменении размера приложения.

<ColumnDefinition Width="{Binding 
    ElementName=RootControl, 
    Path=ActualWidth, 
    Converter={StaticResource MathConverter}, 
    ConverterParameter=(@VALUE-150)/7}" />

150 - ширина заголовков строк + все поля и границы.Я на самом деле в процессе обновления моего MathConverter до IMultiValueConverter, так что я могу связать оба параметра (Если вы заинтересованы в коде конвертера, его можно найти здесь , хотя это толькооднозначный преобразователь)

Ответы [ 5 ]

10 голосов
/ 26 сентября 2011

Вы можете:

1) Жесткий код размера в DIP:

<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
...

2) Использовать SharedSizeGroup, он принимает символ

<ColumnDefinition SharedSizeGroup="A" />
<ColumnDefinition SharedSizeGroup="A" />
...

Вы можете прочитатьподробнее об этом здесь

5 голосов
/ 26 сентября 2011

Вы можете попробовать привязать ширину ваших столбцов к свойству, которое делит общую ширину окна на количество столбцов

0 голосов
/ 11 июля 2018

Попробуйте работу IsSharedSizeScope Grid:

<StackPanel Margin="15" Grid.IsSharedSizeScope="True">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" SharedSizeGroup="A"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="Auto" SharedSizeGroup="B"/>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0" Text="Col 1"/>
        <TextBox Grid.Column="1" />
        <TextBlock Grid.Column="2" Text="3rd column here"/>
    </Grid>

    <Separator Margin="0,20"/>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" SharedSizeGroup="A"/>
            <ColumnDefinition />
            <ColumnDefinition SharedSizeGroup="B"/>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0" Text="1"/>
        <TextBox Grid.Column="1"/>
    </Grid>
</StackPanel>

Надеюсь, это поможет.

Для подробного описания проверьте эту ссылку: https://wpf.2000things.com/tag/sharedsizegroup/

0 голосов
/ 19 декабря 2015

Самый чистый способ - использовать UniformGrid, например:

<UniformGrid Rows="1">
    <Rectangle Fill="Blue" />
    <Rectangle Fill="Yellow" />
    <Rectangle Fill="Red" />
</UniformGrid>

Очень приятно при использовании в качестве ItemsPanel.

0 голосов
/ 26 сентября 2011

Я не пробовал, но я думаю, что это должно работать:

XAML:

<ColumnDefinition Width="*" Loaded="ColumnDefinition_Loaded"/>

C #:

private void ColumnDefinition_Loaded(object sender, RoutedEventArgs e)
        {
            ((ColumnDefinition)sender).MaxWidth = ((ColumnDefinition)sender).ActualWidth;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...