Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Масштабирование canvas


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

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

<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>


Автор: 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.

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

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

Думаю, что измениться, по крайней мере если изменять RenderTransform. Ты это предположил или был практический опыт? У меня нет счас доступа к тому коду, поэтому проверить смогу только вечером, но если честно не думаю что ты прав

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

По крайней мере это справедливо для 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,  12:25 Найти цитируемый пост)
Если уж использовать foreach, то только для того чтобы умножить координаты точек на x,y, не примеменяя ScaleTransform.

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

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

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

Можно еще раз уточнить?
Масштабирование линии должно изменять только ее толщину, а координаты должны остаться на месте?
Тогда почему бы не масштабировать ее только по одной координате?

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

            <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"/>

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

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

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

Наоборот, масштабирование должно менять ее координаты, а ширину не затрагивать

Автор: exBlender 15.10.2009, 21:02
А зачем вообще мучиться с линиями? Я адорнеры делал бордерами, а вместо канваса, имхо, почти всегда катит грид, за очень редкими исключениями...

Автор: math64 16.10.2009, 07:26
Бордер при масштабировании тоже меняет толщину, чтобы ширина не менялась нужно изменять свойства Width и Height. Кроме того, бордеров диагональную линую не нарисуешь - разве что поворачивать его. А с помощью Path можно нарисовать что угодно, поместить его на грид и задать Strech="Fill" или Strech="Uniform" и Margin, если нужно - не вижу никаких сложностей. fantast'у вряд ли нужны адорнеры - я просто привёл пример применения.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)