Объединить расширитель и сетку (расширитель с изменяемым размером)

Я хотел бы иметь что-то вроде расширителя с изменяемым размером. Моя основная идея была примерно такой:

<Grid HorizontalAlignment="Left">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="2" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <Expander Grid.Column="0" ExpandDirection="Right">
          ...
    </Expander>

    <GridSplitter Grid.Column="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" />

    ...
</Grid>

Проблема с этим: если я перемещаю разделитель сетки и сворачиваю расширитель, я получаю большую пустую область. Как сделать так, чтобы вся колонна рухнула? Или есть другой способ сделать расширитель "изменяемым"


person Daniel Bişar    schedule 05.04.2011    source источник
comment
У меня была та же проблема, и это [мое решение] [1] [1]: stackoverflow.com/a/31027745/2219089   -  person Bashnia007    schedule 24.06.2015


Ответы (2)


Не уверен, чего вы пытаетесь достичь, но я думаю, что концептуально Grid должен быть частью Expander.Content, подойдет ли это вам?

<Expander Header="Test" ExpandDirection="Right" HorizontalAlignment="Left" Background="LightBlue">
    <Expander.Content>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="5"/>
            </Grid.ColumnDefinitions>
            <TextBlock Text="Lorem ipsum dolor sit"/>
            <GridSplitter Grid.Column="1" Width="5" ResizeBehavior="PreviousAndCurrent" ResizeDirection="Columns"/>
        </Grid>
    </Expander.Content>
</Expander>

Изменить: удалены все триггеры из первого столбца, так как они казались ненужными.

Кроме того: для вертикальной работы GridSplitter HorizontalAlignment должен быть установлен в Stretch, иначе он будет иметь нулевую ширину по умолчанию (конечно, все остальное, зависящее от ориентации, также должно быть адаптировано, но это просто)

HorizontalAlignment — это средство доступа к свойству Microsoft .NET, которое на самом деле является свойством зависимости. Это конкретное свойство зависимости довольно часто имеет очевидное значение «по умолчанию», установленное по-разному в элементах подкласса, особенно в элементах управления. [...] Например, очевидное «по умолчанию» HorizontalAlignment для элемента управления Label будет Left, даже если Label наследует HorizontalAlignment непосредственно от FrameworkElement. Это связано с тем, что это значение было сброшено в стиле Label по умолчанию в шаблоне элемента управления стиля.

person H.B.    schedule 05.04.2011
comment
Отлично, это именно то, что мне нужно! - person Daniel Bişar; 06.04.2011
comment
На всю жизнь я не могу заставить что-то подобное работать горизонтально! - person DaveO; 04.05.2011
comment
@DaveO: см. мою заметку в ответе. - person H.B.; 04.05.2011
comment
Обновлен пример, чтобы иметь HorizontalAlignment. - person Dennis; 22.08.2011

Может быть, это поможет решить вашу проблему "схлопывания столбца"

XAML:

Добавьте <Grid> Name="expGrid" и добавьте <Expander> Collapsed="Expander_Collapsed"

Код С#:

private void Expander_Collapsed(object sender, RoutedEventArgs e)
{
  var colomnIndex = Grid.GetColumn(sender as Expander);
  var colomn = expGrid.ColumnDefinitions[colomnIndex];
  colomn.Width = GridLength.Auto;
}
person Sonorx    schedule 05.04.2011