Repor Expander ao comportamento colapso padrão
Pergunta
Eu estou usando um expansor dentro de um Resizer (a ContentControl com uma pinça de redimensionamento), e ele se expande / colapsos corretamente quando o controle inicialmente vem à tona. Uma vez que eu redimensioná-la, o Expander não vai corretamente entrar em colapso, como documentado abaixo. Corri Snoop sobre o meu pedido, e eu não vejo nenhum alturas definidas em Expander ou seus constituintes.
Como eu iria sobre convencer Expander a entrar em colapso corretamente novamente? Ou modificar Resizer não fazer Expander triste iria funcionar tão bem.
documentação Expander diz:
"Para um Expander para funcionar corretamente, não especifique um Height no controle Expander quando a propriedade ExpandDirection está definido para baixo ou para cima. Da mesma forma, não especificar uma largura no controle Expander quando a propriedade ExpandDirection está definido para a esquerda ou Direita. quando você definir um tamanho no controle Expander no sentido de que o conteúdo expandido é exibido, a área que é definida pelo parâmetro tamanho é apresentada com uma margem em torno dele. Esta área exibe mesmo quando a janela é recolhido. Para definir o tamanho da janela expandida, dimensões de tamanho definido no conteúdo do controle Expander ou o ScrollViewer que inclui o conteúdo ".
Solução 2
Eu não tive a oportunidade de zombar-se esta questão em particular desde então, mas eu descobri recentemente que a definição de altura ou largura para Double.NaN redefine-lo ao seu comportamento de espírito livre padrão.
Ironicamente, esta foi a partir da leitura do código do controle Resizer eu estava usando em primeiro lugar.
Outras dicas
Eu resolvi o problema movendo o Resizer dentro do Expander, mas eu tenho que correr para a questão Expander em outros lugares, isso seria ainda como uma resposta se alguém tem.
graças
A resposta a esta um pouco tarde (2 + anos), mas, hey, melhor tarde do que nunca, certo?
De qualquer forma, eu corri para este problema exato e foi capaz de resolvê-lo com algum código-behind para salvar e larguras de coluna de reset.
I têm um 3 numa coluna da grade, com um conteúdo na primeira coluna, o GridSplitter na segunda coluna, e o expansor na terceira coluna. Parece que o que está acontecendo é que, após o GridSplitter é movido a largura da coluna que contém o Expander é alterado de Auto para um tamanho fixo. Isso faz com que o Expander para não mais colapso como esperado.
Então, eu adicionei uma variável privada e dois manipuladores de eventos:
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;
}
Quando o Expander é recolhido I save largura fixa de Column2 (que foi alterado de Auto auto-magicamente no algum lugar fundo), em seguida, redefinir a largura para Auto.
Em seguida, quando o expansor está expandida, para restaurar a parte de trás da coluna para a largura fixo por isso expande-se para a mesma largura do que era antes de ter sido recolhido.
Aqui está o XAML para referência:
<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>
Eu corri para um problema semelhante usando um Expander dentro de uma grade com um GridSplitter. O comportamento expandir / recolher fina funciona até que eu mover o divisor ... Depois, o Expander não vai entrar em colapso, ele só esconde o seu conteúdo.
Eu ainda estou procurando uma solução alternativa ... você eventualmente encontrar um?