Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Масштабирование canvas, Без масштабирования толщины линий 
:(
    Опции темы
fantast
Дата 12.10.2009, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

Репутация: нет
Всего: 2



Есть canvas, содержащий некоторое количество Shapes.Line. Я изменяю ScaleTransform для него, соответственно увеличивается все изображение пропорционально, а мне желательно не увеличивать толщину линий ( тоесть до увеличения толщина была скажем 5 пикселей, и чтоб после такой же осталась )? 
Возможно есть удобное решение, если нет то с удовольствием выслушаю какие-нибудь идеи. Спасибо

Это сообщение отредактировал(а) fantast - 12.10.2009, 11:49
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
math64
Дата 12.10.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Нужно масштабировать не канву, а геометрию - тогда толщина линий не изменяется.
Код

<Grid Width = "200" Height ="100">
<Line X1="0" Y1="0" X2="1" Y2="1" Stretch="Fill" Stroke="Black"/>
</Grid>

или
Код

<Grid Width = "200" Height ="100">
<Path Data="M0,0 L1,1" Stretch="Fill" Stroke="Black"/>
</Grid>



Это сообщение отредактировал(а) math64 - 12.10.2009, 12:27
PM   Вверх
Anyone
Дата 12.10.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Есть идея - в лоб. 
Получить список линий можно примерно так:
canvas.Children.OfType<Shapes.Line>()
и в цикле foreach для каждой из линий применять ScaleTransform(1.0/х,1.0/у) так, чтобы скомпенсировать ScaleTransform(х,у) канваса.

PM MAIL   Вверх
math64
Дата 12.10.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Нет, так толщина линий всё равно изменится. Если уж использовать foreach, то только для того чтобы умножить координаты точек на x,y, не примеменяя ScaleTransform.
PM   Вверх
fantast
Дата 12.10.2009, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

Репутация: нет
Всего: 2



Цитата(math64 @  12.10.2009,  12:25 Найти цитируемый пост)
Нет, так толщина линий всё равно изменится. Если уж использовать foreach, то только для того чтобы умножить координаты точек на x,y, не примеменяя ScaleTransform. 

насколько я понял как раз таки  ширина останеться тойже, но еще и изменяться размеры линии - масштабирование будет произведено и над шириной и над расположением линии. Такчто это отпадает
Цитата(math64 @  12.10.2009,  12:12 Найти цитируемый пост)
Нужно масштабировать не канву, а геометрию - тогда толщина линий не изменяется.

Думаю, что измениться, по крайней мере если изменять RenderTransform. Ты это предположил или был практический опыт? У меня нет счас доступа к тому коду, поэтому проверить смогу только вечером, но если честно не думаю что ты прав
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
math64
Дата 12.10.2009, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Цитата(fantast @  12.10.2009,  13:17 Найти цитируемый пост)
Ты это предположил или был практический опыт?

По крайней мере это справедливо для Path и неверно для Ellipse. Для остальных шейпов не проверял.
PM   Вверх
fantast
Дата 12.10.2009, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

Репутация: нет
Всего: 2



Как я понимаю, теоретически если применить scale в x2 в RenderTransform  для Line которая имеет координаты {10, 12} - {15, -2} c толщиной в 2, то линия будет отображаться как {20,24} - {30, -4} c толщиной 4. Я правильно понимаю, если нет - то как правильно, если да - то изменяться координаты линии, которые в моем случае не должны меняться, а должна меняться только ширина
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
Anyone
Дата 12.10.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Я изначально не правильно понял вопрос, потому согласен с 
Цитата(math64 @  12.10.2009,  12:25 Найти цитируемый пост)
Если уж использовать foreach, то только для того чтобы умножить координаты точек на x,y, не примеменяя ScaleTransform.

Не понимаю в чем еще проблема.

Цитата(fantast @  12.10.2009,  13:17 Найти цитируемый пост)
У меня нет счас доступа к тому коду, поэтому проверить смогу только вечером

Ну попробуй несколько вариантов, а потом напиши что из этого получилось.

Можно еще раз уточнить?
Масштабирование линии должно изменять только ее толщину, а координаты должны остаться на месте?
Тогда почему бы не масштабировать ее только по одной координате?
PM MAIL   Вверх
math64
Дата 12.10.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Такое масштабирование нужно, чтобы не писать лишнего кода. Вот фрагмент адорнера, подписывающий ширину элемента, толщина линий не масштабируется:
Код

            <Path Stroke="Red"
                  StrokeThickness="1"
                  Height="10"
                  VerticalAlignment="Bottom"
                  Margin="-2,0,-2,-15"
                  Stretch="Fill"
                  Data="M0,0 0,10 M 0,5 100,5 M 100,0 100,10"/>
            <TextBlock Text="{Binding Path=Width}"
                       Background="White"
                       Padding="3,0,3,0"
                       Foreground="Red"
                       Margin="0,0,0,-18"
                       HorizontalAlignment="Center"
                       VerticalAlignment="Bottom"/>

PM   Вверх
Anyone
Дата 12.10.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Цитата(math64 @  12.10.2009,  15:37 Найти цитируемый пост)
Вот фрагмент адорнера, подписывающий ширину элемента, толщина линий не масштабируется:

Этот фрагмент случайно не с файла SizeChrome.xaml?   smile  
Почему не масштабируется? При масштабировании канваса у меня масштабируется? Или я что-то не правильно понимаю?

Это сообщение отредактировал(а) Anyone - 12.10.2009, 16:07
PM MAIL   Вверх
fantast
Дата 12.10.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 10.12.2006
Где: минск, столица на шей Родины

Репутация: нет
Всего: 2



Цитата(Anyone @  12.10.2009,  14:30 Найти цитируемый пост)
Масштабирование линии должно изменять только ее толщину, а координаты должны остаться на месте?
Тогда почему бы не масштабировать ее только по одной координате? 

Наоборот, масштабирование должно менять ее координаты, а ширину не затрагивать
--------------------
Эпитафия: Он старался.                                   Неизвестный
PM MAIL   Вверх
exBlender
Дата 15.10.2009, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.10.2009

Репутация: 9
Всего: 9



А зачем вообще мучиться с линиями? Я адорнеры делал бордерами, а вместо канваса, имхо, почти всегда катит грид, за очень редкими исключениями...
--------------------
HTML и CSS забыв как страшный сон, хвалу я заммэлу пою и фирме Майкрософт.
PM MAIL   Вверх
math64
Дата 16.10.2009, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Бордер при масштабировании тоже меняет толщину, чтобы ширина не менялась нужно изменять свойства Width и Height. Кроме того, бордеров диагональную линую не нарисуешь - разве что поворачивать его. А с помощью Path можно нарисовать что угодно, поместить его на грид и задать Strech="Fill" или Strech="Uniform" и Margin, если нужно - не вижу никаких сложностей. fantast'у вряд ли нужны адорнеры - я просто привёл пример применения.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.1764 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.