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

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

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

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

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's HorizontalAlignment должен быть установлен в Stretch иначе он будет иметь нулевую ширину по умолчанию (конечно, все остальное, что зависит от ориентации, также должно быть адаптировано, но это просто)

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

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

XAML:

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

Код C#:

private void Expander_Collapsed(object sender, RoutedEventArgs e)
{
  var colomnIndex = Grid.GetColumn(sender as Expander);
  var colomn = expGrid.ColumnDefinitions[colomnIndex];
  colomn.Width = GridLength.Auto;
}
Другие вопросы по тегам