/ / Как мога да измерим елемент без да въвеждам странични ефекти? - wpf, оформление, мярка

Как мога да измерим елемент без да въвеждам странични ефекти? - wpf, оформление, мярка

Как мога да помоля контрола да изчисли минималните изисквания за размер, но без да оказва влияние върху текущото състояние или бъдещите му оформления?

Например, да кажа, че имам StackPanel в мрежа. Ширината на StackPanel ще се простира до размера на ширината на мрежата. Но как можах да изчисля минималната ширина на StackPanels, без да засягам нищо.

Разглеждайки метода на измерването, той казва "Updates the DesiredSize of a UIElement. Calling this method constitutes the first pass (the "Measure" pass) of a layout update."

Така че този подход има странични ефекти.

Отговори:

2 за отговор № 1

Аз не вярвам, че е възможно да се направи това в WPF. Исках точно същата способност (да се измери при дадена ограничена без да се налага пълна мярка / подреждане на пропуск.

Един експеримент, който направих, беше да запазя токаDesiredSize, след това InvalidateMeasure, последвано от UpdateLayout и след това Measure и look at DesiredSize. След това задайте повторно това със стария / запазен размер. За съжаление това е бавно и има лош страничен ефект в нашето приложение, което е, че UpdateLayout () ще изпълни цикъла на събитието, за да обработи събитията на оформлението. Това може да доведе до пренасочване и обработка на други, несвързани със събития в опашката събития, които не очаквах до приключването на измервателната работа. Хаос произтича. Накратко, това е IMO проектно решение (недостатък?) В WPF. Аз отворих Потребителска заявка като се моли за способността за измерване на оформлението без обработката на събитието. Предполагам, че "никога няма да се случи.

Прибягнах до използването на скрит прозорец с(например празен бутон) .Аз правя UpdateLayout, когато е безопасно и вземете желания размер като "празен" размер. Използвам този размер като част от изчисленията по-късно. Използвам TextFormatter и GenericTextParagraphProperties за измерване на самия текст, както направи текстообработката. Много грозен код, само за да избегнете повтаряне на съобщението и да оставите контролите незасегнати! Също така е крехка б / с промяна на шаблона, която ще обезсили изчисленията ми. За щастие контролирам шаблона напълно за контролите, които трябва да измеря.


0 за отговор № 2

Може да извършите своето собствено изчисление въз основа на код, предоставен от Microsoft например. StackPanel: http://referencesource.microsoft.com/#PresentationFramework/Framework/System/Windows/Controls/Stack.cs,9ef706576207e5a6,references

Въпреки това StackPanel използва измерване на техните децаза да изчислите собствената си DesiredSize, така че може би е трудно да се изчисли всичко това сами. Мисля, че трябва да предоставите повече информация защо не искате да се отразите на текущото състояние. Какво не е наред с настройването на DesiredSize на UIElement?


0 за отговор № 3

Мисля, че най-доброто, което можете да постигнете тук, е това,Метод на измерване. Той има странични ефекти, но ако го наричате няколко пъти, само последното състояние остава валидно. Не е нужно да се притеснявате за визуални артефакти, такива като нас, които трепкат временни оформления. Само последният ще бъде представен.