web-dev-qa-db-ja.com

エキスパンダーとグリッドを組み合わせる(サイズ変更可能なエキスパンダー)

サイズ変更可能なエキスパンダーのようなものが欲しいのですが。私の基本的な考えは次のようなものでした:

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

これに伴う問題:グリッドスプリッターを移動してエキスパンダーを折りたたむと、大きな空の領域ができました。どうすれば列全体を崩壊させることができますか?または、エキスパンダーを「サイズ変更可能」にする別の方法はありますか

15
Daniel Bişar

何を達成しようとしているのかわかりませんが、概念的にはGridExpander.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の HorizontalAlignmentStretchに設定する必要があります。そうしないと、デフォルトで幅がゼロになります(もちろん、他のすべての方向は-特定のものも適応させる必要がありますが、それは簡単です)

Horizo​​ntalAlignmentは、実際には依存関係プロパティであるMicrosoft.NETプロパティアクセサーです。この特定の依存関係プロパティでは、サブクラス化された要素、特にコントロールで、見かけの「デフォルト」値が異なる方法で設定されることがよくあります。 [...]たとえば、LabelがFrameworkElementから直接Horizo​​ntalAlignmentを継承している場合でも、LabelコントロールのHorizo​​ntalAlignmentの見かけの「デフォルト」はLeftになります。これは、その値が、スタイルのコントロールテンプレート内のデフォルトスタイルのラベル内でリセットされたためです。

20
H.B.

多分これはあなたの「列の崩壊」問題を解決するのに役立つでしょう

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