/ / Jak zmierzyć element bez wprowadzania efektów ubocznych? - wpf, layout, measure

Jak mogę zmierzyć element bez wprowadzania efektów ubocznych? - wpf, layout, measure

Jak mogę poprosić kontrolkę, aby obliczyła minimalne wymagania rozmiaru, ale bez wpływu na jej bieżący stan lub przyszłe układy?

Na przykład powiedz, że mam StackPanel w siatce. Szerokość stosu StackPanel zostanie rozciągnięta do rozmiaru szerokości siatki. Ale jak mogłem obliczyć minimalną szerokość StackPaneli bez wpływu na cokolwiek.

Patrząc na metodę Measure, mówi "Updates the DesiredSize of a UIElement. Calling this method constitutes the first pass (the "Measure" pass) of a layout update."

Takie podejście ma skutki uboczne.

Odpowiedzi:

2 dla odpowiedzi № 1

Nie wierzę, że można to zrobić w WPF. Chciałem dokładnie taką samą zdolność (do zmierzenia pod warunkiem ograniczenia bez wywoływania pełnej zmiany Measure / Arrange.

Jednym z eksperymentów, który zrobiłem, było uratowanie prąduDesiredSize, następnie InvalidateMeasure, a następnie UpdateLayout, a następnie zmierzyć i spojrzeć na DesiredSize. Następnie ustaw ponownie, używając starego / zapisanego rozmiaru. Niestety jest to powolne i ma zły efekt uboczny w naszej aplikacji, która polega na tym, że UpdateLayout () uruchomi pętlę zdarzeń w celu przetworzenia zdarzeń układu. Może to spowodować ponowne pojawienie się i przetwarzanie innych niepowiązanych zdarzeń w kolejce, których nie oczekiwałem, aż do zakończenia pracy pomiarowej. Powstaje Chaos. W skrócie, to jest decyzja IMO (błąd?) W WPF. Otworzyłem Żądanie UserVoice błaganie o możliwość pomiaru układów bez przetwarzania zdarzeń. Przewiduję, że to się nigdy nie wydarzy.

Użyłem ukrytego okna zinstancja kontrolki, której nie interesuje żadna treść (np. i pusty przycisk) Wykonuję UpdateLayout, gdy jest bezpieczny i łapię pożądany rozmiar jako "pusty" rozmiar. Używam tego rozmiaru jako części późniejszych obliczeń. Używam TextFormatter i GenericTextParagraphProperties do pomiaru tekstu w taki sam sposób, jak robi to TextBlock. Bardzo brzydki kod, aby uniknąć pętli komunikatów i pozostawić niezmienioną kontrolę! Jest również delikatny b / c zmiana szablonu spowoduje unieważnienie moich obliczeń, na szczęście całkowicie kontroluję szablon dla kontroli, które muszę zmierzyć.


0 dla odpowiedzi nr 2

Możesz wykonać własne obliczenia na podstawie kodu dostarczonego przez Microsoft np. StackPanel: http://referencesource.microsoft.com/#PresentationFramework/Framework/System/Windows/Controls/Stack.cs,9ef706576207e5a6,references

Jednak StackPanel używa Measure swoich dzieciobliczyć swoją własną DesiredSize, więc może to być trudna do obliczenia tego samodzielnie. Myślę, że powinieneś podać więcej informacji, dlaczego nie chcesz wpływać na bieżący stan. Co jest nie tak z ustawieniem Żądanej wersji narzędzia Żądana?


0 dla odpowiedzi № 3

Myślę, że najlepsze, co możesz osiągnąć, to dzwonićMetoda pomiaru. Ma efekty uboczne, ale jeśli wywołasz ją wiele razy, tylko ostatni stan pozostaje ważny. Nie musisz się martwić o artefakty wizualne, takie jak migotliwe tymczasowe układy, tylko ostatni będzie renderowany.