Como posso pedir a um controle para calcular os requisitos de tamanho mínimo, mas sem afetar o estado atual ou os futuros layouts?
Por exemplo, digamos que eu tenha um StackPanel em uma grade. A largura do StackPanel aumentará para o tamanho da largura da grade. Mas como eu poderia calcular a largura mínima do StackPanels sem afetar nada.
Olhando para o método Measure, diz "Updates the DesiredSize of a UIElement. Calling this method constitutes the first pass (the "Measure" pass) of a layout update."
Então essa abordagem tem efeitos colaterais.
Respostas:
2 para resposta № 1Eu não acredito que é possível fazer isso no WPF. Eu queria exatamente a mesma habilidade (para medir dada uma restrição sem induzir uma passagem completa de Medir / Organizar).
Uma experiência que fiz foi salvar a correnteDesiredSize, InvalidateMeasure seguido de UpdateLayout e, em seguida, Measure e examine DesiredSize. Em seguida, defina isso com o tamanho antigo / salvo. Infelizmente é lento e há um efeito colateral ruim em nosso aplicativo, que é que o UpdateLayout () executará o loop de eventos para processar eventos de layout. Isso pode resultar em reentrância e processamento de outros eventos enfileirados não relacionados que eu não esperava até que o trabalho de medição fosse concluído. O caos segue. Em suma, isso é IMO uma decisão de design (falha?) No WPF. Eu abri um Pedido do UserVoice implorando pela capacidade de medir layouts sem o processamento do evento. Eu prevejo que isso nunca acontecerá.
Eu tenho recorrido a usar uma janela escondida com uminstância do controle que eu estou interessado em sem conteúdo (ex. e botão vazio). Eu faço um UpdateLayout quando é seguro e pegar o desejado como o tamanho "vazio". Eu uso esse tamanho como parte dos cálculos mais tarde. Eu uso TextFormatter e GenericTextParagraphProperties para medir o texto eu mesmo o mesmo que um TextBlock. Código muito feio apenas para evitar um loop de mensagem e deixar os controles inalterados! É também frágil b / c uma mudança de modelo irá invalidar meus cálculos Felizmente, eu controlo o modelo completamente para os controles que eu preciso medir.
0 para resposta № 2
Você pode realizar seu próprio cálculo com base no código fornecido pela microsoft, por exemplo. StackPanel: http://referencesource.microsoft.com/#PresentationFramework/Framework/System/Windows/Controls/Stack.cs,9ef706576207e5a6,references
No entanto StackPanel usa Medida de seus filhospara calcular o seu próprio DesiredSize, então pode ser uma luta calcular tudo sozinho. Eu acho que você deve fornecer mais informações porque você não quer afetar o estado atual. O que está errado com a definição de DesiredSize de UIElement?
0 para resposta № 3
Eu acho melhor você pode conseguir aqui está chamandoMeça o método. Ele tem efeitos colaterais, mas se você chamá-lo várias vezes, apenas o último estado permanece válido. Você não precisa se preocupar com artefatos visuais, como os de trepidação temporária. Somente o último será renderizado.