/ Como posso medir um elemento sem introduzir efeitos colaterais? - wpf, layout, medida

Como posso medir um elemento sem introduzir efeitos colaterais? - wpf, layout, medida

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

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