WPF: Ка получить размеры UIElement с эффектами
От: HotDog Швейцария www.denebspace.com
Дата: 20.12.10 15:12
Оценка:
XAML

                    <TextBlock>
                        <TextBlock.Effect>
                            <DropShadowEffect BlurRadius="8" Direction="315" />
                        </TextBlock.Effect>

                        Hello World
                    </TextBlock>


Результат:


Как измерить размер элемента вместе с тенью?
Re: WPF: Ка получить размеры UIElement с эффектами
От: Vladek Россия Github
Дата: 20.12.10 19:47
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Как измерить размер элемента вместе с тенью?


Давайте начнём издалека. Зачем?
Re[2]: WPF: Ка получить размеры UIElement с эффектами
От: HotDog Швейцария www.denebspace.com
Дата: 21.12.10 06:30
Оценка:
Здравствуйте, Vladek, Вы писали:

V>Здравствуйте, HotDog, Вы писали:


HD>>Как измерить размер элемента вместе с тенью?


V>Давайте начнём издалека. Зачем?


Надо сохранить изображение в виде битмапа (Png). Добавлять по краям Х пикселей в надежде, что тень туда попадет не предлагать. Т.к. рамеры шрифта и параметры тень варьируются.
Re[3]: WPF: Ка получить размеры UIElement с эффектами
От: MxMsk Португалия  
Дата: 21.12.10 07:28
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Надо сохранить изображение в виде битмапа (Png). Добавлять по краям Х пикселей в надежде, что тень туда попадет не предлагать. Т.к. рамеры шрифта и параметры тень варьируются.

Ну варьируются и ладно. Размер текста всегда можно подсчитать через FormattedText, а тень имеет вполне конкретные настройки, которые можно учесть.
Re[4]: WPF: Ка получить размеры UIElement с эффектами
От: HotDog Швейцария www.denebspace.com
Дата: 21.12.10 08:05
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM> Ну варьируются и ладно. Размер текста всегда можно подсчитать через FormattedText, а тень имеет вполне конкретные настройки, которые можно учесть.


Ну т.е. WPF может все правильно отобразить, а вот вернуть нам информацию о том где и как это будет сделано — никак?
Старая сказка про "... и повернулась избушка к лесу передом а к нам задом" на новый лад
avalon 1.0rc3 rev 363, zlib 1.2.3
Re[3]: WPF: Ка получить размеры UIElement с эффектами
От: Sinix  
Дата: 21.12.10 08:09
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Надо сохранить изображение в виде битмапа (Png). Добавлять по краям Х пикселей в надежде, что тень туда попадет не предлагать. Т.к. рамеры шрифта и параметры тень варьируются.


http://stackoverflow.com/questions/831860/generate-bitmapsource-from-uielement
http://www.switchonthecode.com/tutorials/wpf-tutorial-getting-from-wpf-to-a-metafile-and-onto-the-clipboard

В качестве размера передать ActualSize.
Re[4]: WPF: Ка получить размеры UIElement с эффектами
От: HotDog Швейцария www.denebspace.com
Дата: 21.12.10 09:38
Оценка:
Здравствуйте, Sinix, Вы писали:
S> В качестве размера передать ActualSize.

ActualSize не учитывает применый эффект. Сохраненный битмап с ActualSize выглядит так:
avalon 1.0rc3 rev 363, zlib 1.2.3
Re[5]: WPF: Ка получить размеры UIElement с эффектами
От: Sinix  
Дата: 21.12.10 10:01
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>ActualSize не учитывает применый эффект. Сохраненный битмап с ActualSize выглядит так:


Да. Осталось всего-то расставить padding'и.
Re[6]: WPF: Ка получить размеры UIElement с эффектами
От: HotDog Швейцария www.denebspace.com
Дата: 21.12.10 11:29
Оценка:
Здравствуйте, Sinix, Вы писали:

S> Да. Осталось всего-то расставить padding'и.


В том то все и дело, что WPF уже имеет информацию о примененном эффекте (иначе бы оно неверно отображалось на "канвасе"), но вот получить эту информацию (bounding box) нет возможности.

Можно конечно и вручную солнце "закатить" — посчитать размер блюра на основании радиуса и смещения тени, учесть размер фонта и т.д. Но это все частный случай. Каким образом прикажете мне все это высчитывать, если на текст или произвольный UIElement навесят шейдерный эффект, который делает неизвестно что?
avalon 1.0rc3 rev 363, zlib 1.2.3
Re[5]: WPF: Ка получить размеры UIElement с эффектами
От: MxMsk Португалия  
Дата: 21.12.10 11:32
Оценка: +1
Здравствуйте, HotDog, Вы писали:

HD>Ну т.е. WPF может все правильно отобразить, а вот вернуть нам информацию о том где и как это будет сделано — никак?

HD>Старая сказка про "... и повернулась избушка к лесу передом а к нам задом" на новый лад
Сможешь рассказать, как рассчитать место, которое займет произвольный пользовательский шейдерный эффект?
Re[6]: WPF: Ка получить размеры UIElement с эффектами
От: HotDog Швейцария www.denebspace.com
Дата: 21.12.10 11:41
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM> Сможешь рассказать, как рассчитать место, которое займет произвольный пользовательский шейдерный эффект?


WPF отображает эффект, значит он "знает" по меньшей мере его конечные размеры. Верно?
avalon 1.0rc3 rev 363, zlib 1.2.3
Re[7]: WPF: Ка получить размеры UIElement с эффектами
От: MxMsk Португалия  
Дата: 21.12.10 12:32
Оценка: 11 (2)
Здравствуйте, HotDog, Вы писали:

MM>> Сможешь рассказать, как рассчитать место, которое займет произвольный пользовательский шейдерный эффект?

HD>WPF отображает эффект, значит он "знает" по меньшей мере его конечные размеры. Верно?
Не знаю. Припоминаю какое-то обсуждение на MSDN, где разработчик WPF писал, что с эффектами не все просто. Например, их нельзя использовать в DrawingContext.
Однако, на удивление, изучение Рефлектором кода показало, что в классе Effect есть internal метод GetRenderBounds. Через рефлексию его можно дернуть.
Re[8]: WPF: Ка получить размеры UIElement с эффектами
От: HotDog Швейцария www.denebspace.com
Дата: 21.12.10 13:49
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM> Однако, на удивление, изучение Рефлектором кода показало, что в классе Effect есть internal метод GetRenderBounds. Через рефлексию его можно дернуть.


Попробую добраться до этого GetRenderBounds и глянуть, что он возвращает. Но это опять таки костыль, который может отвалиться после первого же апдейта
avalon 1.0rc3 rev 363, zlib 1.2.3
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.