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

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

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

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

Ответы

Ответ 1

Не уверен, что вы пытаетесь выполнить, но я думаю, что концепт 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 для того, что на самом деле является свойством зависимостей. Это конкретное свойство зависимостей довольно часто имеет свое кажущееся "значение по умолчанию", установленное по-разному в элементах подкласса, особенно в элементах управления. [...] Например, кажущийся "по умолчанию" для параметра "Горизонтальное выравнивание" для элемента "Ярлык" будет левым, хотя "Ярла" наследует "Горизонтальное выравнивание" непосредственно из FrameworkElement. Это связано с тем, что это значение было reset в стиле по умолчанию Label, в шаблоне управления стилем.

Ответ 2

Возможно, это поможет решить вашу проблему с "столкновением"

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