エキスパンダーをデフォルトの折りたたみ動作にリセット

StackOverflow https://stackoverflow.com/questions/159470

  •  03-07-2019
  •  | 
  •  

質問

リサイザー内でエキスパンダーを使用しています(サイズ変更グリッパーを備えたContentControl)、およびコントロールが最初に起動したときに適切に展開/折りたたみます。サイズを変更すると、エキスパンダーは以下で説明するように適切に折りたたまれません。アプリケーションでSnoopを実行しましたが、Expanderまたはその構成要素に高さが設定されていません。

Expanderを再び適切に折りたたむよう説得するにはどうすればよいですか?または、Resizerを変更してExpanderを悲しませないようにすることもできます。

Expanderのドキュメントによると:

  

" Expanderが正しく機能するためには、ExpandDirectionプロパティがDownまたはUpに設定されている場合、ExpanderコントロールでHeightを指定しないでください。同様に、ExpandDirectionプロパティがLeftまたはRightに設定されている場合、ExpanderコントロールでWidthを指定しないでください。 Expandedコントロールで、展開されたコンテンツが表示される方向にサイズを設定すると、sizeパラメーターで定義された領域が境界線で表示されます。この領域は、ウィンドウが折りたたまれている場合でも表示されます。展開されたウィンドウのサイズを設定するには、Expanderコントロールまたはコンテンツを囲むScrollViewerのコンテンツにサイズの寸法を設定します。"

役に立ちましたか?

解決 2

それ以降、この特定の問題をモックアップする機会はありませんでしたが、最近、HeightまたはWidthをDouble.NaNに設定すると、デフォルトの自由な動作にリセットされることを発見しました。

皮肉なことに、これは私が最初に使っていたResizerコントロールのコードを読んでいたからです。

他のヒント

ResizerをExpander内に移動することで問題を解決しましたが、別の場所でExpanderの問題に遭遇しました。

ありがとう

これに少し遅れて(2年以上)回答しますが、ねえ、絶対に遅れるよりはましですか?

とにかく、私はこの正確な問題に遭遇し、いくつかのコードビハインドで列幅を保存およびリセットすることでそれを解決することができました。

3列のグリッドがあり、最初の列にコンテンツがあり、2列目にGridSplitterがあり、3列目にエキスパンダーがあります。何が起こっているように見えますが、GridSplitterを移動した後、Expanderを含む列の幅がAutoから固定サイズに変更されます。これにより、エキスパンダーが期待どおりに折りたたまれなくなります。

したがって、私はプライベート変数と2つのイベントハンドラーを追加しました:

    private GridLength _columnWidth;

    private void Expander_Expanded (object sender, RoutedEventArgs e)
    {
        // restore column fixed size saved in Collapse event
        Column2.Width = _columnWidth;
    }

    private void Expander_Collapsed (object sender, RoutedEventArgs e)
    {
        // save current column width so we can restore when expander is expanded
        _columnWidth = Column2.Width;

        // reset column width to auto so the expander will collapse properly
        Column2.Width = GridLength.Auto;
    }

Expanderが折りたたまれている場合、Column2の固定幅(バックグラウンドでAutoから自動で自動的に変更された)を保存し、幅をAutoにリセットします。

その後、エキスパンダーが展開されると、列を固定幅に戻し、折りたたむ前と同じ幅に拡張します。

参照用のXAMLは次のとおりです。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition x:Name="Column2" Width="Auto" />
    </Grid.ColumnDefinitions>
    <ScrollViewer Grid.Column="0" VerticalScrollBarVisibility="Auto">
        <!-- some content goes here -->
    </ScrollViewer>
    <GridSplitter HorizontalAlignment="Right" VerticalAlignment="Stretch"
         Grid.Column="1" ResizeBehavior="PreviousAndNext" Width="5"
         Background="Black" />
    <Expander Grid.Column="2" ExpandDirection="Left"
         IsExpanded="True" Style="{StaticResource LeftExpander}"
         Expanded="Expander_Expanded" Collapsed="Expander_Collapsed">
        <Grid>
            <TextBox TextWrapping="Wrap" Height="Auto" Margin="0 5 5 5" />
        </Grid>
    </Expander>
</Grid>

GridSplitterを使用してGrid内でExpanderを使用すると、同様の問題が発生しました。展開/折りたたみの動作は、スプリッターを移動するまで正常に機能します...その後、展開は折りたたまれず、コンテンツのみが非表示になります。

まだ回避策を探しています...最終的に見つけましたか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top