| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > WPF и Silverlight > Масштабирование canvas |
| Автор: fantast 12.10.2009, 11:48 |
| Есть canvas, содержащий некоторое количество Shapes.Line. Я изменяю ScaleTransform для него, соответственно увеличивается все изображение пропорционально, а мне желательно не увеличивать толщину линий ( тоесть до увеличения толщина была скажем 5 пикселей, и чтоб после такой же осталась )? Возможно есть удобное решение, если нет то с удовольствием выслушаю какие-нибудь идеи. Спасибо |
| Автор: math64 12.10.2009, 12:12 | ||||
Нужно масштабировать не канву, а геометрию - тогда толщина линий не изменяется.
или
|
| Автор: Anyone 12.10.2009, 12:13 |
| Есть идея - в лоб. Получить список линий можно примерно так: canvas.Children.OfType<Shapes.Line>() и в цикле foreach для каждой из линий применять ScaleTransform(1.0/х,1.0/у) так, чтобы скомпенсировать ScaleTransform(х,у) канваса. |
| Автор: math64 12.10.2009, 12:25 |
| Нет, так толщина линий всё равно изменится. Если уж использовать foreach, то только для того чтобы умножить координаты точек на x,y, не примеменяя ScaleTransform. |
| Автор: math64 12.10.2009, 13:28 |
По крайней мере это справедливо для Path и неверно для Ellipse. Для остальных шейпов не проверял. |
| Автор: fantast 12.10.2009, 13:51 |
| Как я понимаю, теоретически если применить scale в x2 в RenderTransform для Line которая имеет координаты {10, 12} - {15, -2} c толщиной в 2, то линия будет отображаться как {20,24} - {30, -4} c толщиной 4. Я правильно понимаю, если нет - то как правильно, если да - то изменяться координаты линии, которые в моем случае не должны меняться, а должна меняться только ширина |
| Автор: Anyone 12.10.2009, 14:30 | ||||
Я изначально не правильно понял вопрос, потому согласен с
Не понимаю в чем еще проблема.
Ну попробуй несколько вариантов, а потом напиши что из этого получилось. Можно еще раз уточнить? Масштабирование линии должно изменять только ее толщину, а координаты должны остаться на месте? Тогда почему бы не масштабировать ее только по одной координате? |
| Автор: math64 12.10.2009, 15:37 | ||
Такое масштабирование нужно, чтобы не писать лишнего кода. Вот фрагмент адорнера, подписывающий ширину элемента, толщина линий не масштабируется:
|
| Автор: Anyone 12.10.2009, 16:07 | ||
Этот фрагмент случайно не с файла SizeChrome.xaml? Почему не масштабируется? При масштабировании канваса у меня масштабируется? Или я что-то не правильно понимаю? |
| Автор: fantast 12.10.2009, 17:45 | ||
Наоборот, масштабирование должно менять ее координаты, а ширину не затрагивать |
| Автор: exBlender 15.10.2009, 21:02 |
| А зачем вообще мучиться с линиями? Я адорнеры делал бордерами, а вместо канваса, имхо, почти всегда катит грид, за очень редкими исключениями... |
| Автор: math64 16.10.2009, 07:26 |
| Бордер при масштабировании тоже меняет толщину, чтобы ширина не менялась нужно изменять свойства Width и Height. Кроме того, бордеров диагональную линую не нарисуешь - разве что поворачивать его. А с помощью Path можно нарисовать что угодно, поместить его на грид и задать Strech="Fill" или Strech="Uniform" и Margin, если нужно - не вижу никаких сложностей. fantast'у вряд ли нужны адорнеры - я просто привёл пример применения. |