2009-05-01 3 views
2

Мне нужно реализовать Canvas, который масштабирует его содержимое в соответствии с его размером. Я знаю, что есть Viewbox, который масштабирует все внутри него. Однако я не могу использовать это, потому что некоторые элементы имеют фиксированный размер и не могут масштабироваться.WPF Resizable Canvas

Также как связать размер Canvas с родительским элементом (например, изменяемым по размеру окном). Для окон есть размерToContent, я хочу, чтобы размер был точно таким же, как и наоборот. Кроме того, холст использует какой-либо чертеж, основанный на размере элемента хостинга, как инициируется перерисовка и как я могу убедиться, что он рисует только если он получает действительный (или минимальный) размер?

ответ

3

Если вы не указываете ширину или высоту на холсте, она автоматически использует все доступное пространство. Это связано с тем, что по умолчанию VerticalAlignment и HorizontalAlignment установлены на Stretch.

Что вы подразумеваете под холстом, который масштабирует его содержимое в соответствии с его размером без масштабирования всего содержимого, поскольку некоторые имеют фиксированный размер?

Update после комментариев

Если ваш алгоритм рисования уже масштабирует содержимое на холсте по высоте и ширине, то все, что вам нужно сделать, это изменить размер холста, чтобы соответствовать площади я верю? В этом случае просто удалите жестко заданные значения высоты/ширины, и размер холста изменится в соответствии с размером контейнера.

Возможно, вам придется использовать ActualHeight/ActualWidth вместо Height/Width в алгоритме рисования. ActualHeight/ActualWidth возвращают значения, которые контейнер макета даст вашему холсту, чтобы они представляли значения, с которыми тянется холст.

+0

Ну, есть какой-то рисунок на холсте, рисунок algo использует высоту и свойство холста как константу и вещи (или растянуты) относительно этого – Nils

+0

Если я установил все, чтобы растянуться, высота и С холста не определены .. Думаю, мне нужно поймать это в коде? – Nils

+0

Если я настроил все на Strech, высота и С холста не определены при рисовании вначале .. угадайте, мне нужно поймать это в коде – Nils

2

Я думаю, вы можете найти ответы на все ваши вопросы в моем London Underground demo.

+0

thx посмотрит на него позже – Nils

0

Я делаю это из памяти, но если я правильно назову, окно использует либо панель, либо холст, как часть его ControlTemplate (в котором находится ContentPresenter), что означает, что холст, помещенный непосредственно в окно, будет имеют проблемы с изменением размера автоматически, как это могло бы быть в другом месте. Существует несколько основных способов решения этой проблемы.

1 Напишите новый образец ControlTemplate для вашего окна. :(
2 Поместите содержимое непосредственно в окне, а не в Canvas внутри окна.:/
3 Выполните по имени связывания :)

<MyWindow x:Name="topWindow"> 
    <Canvas x:Name="topCanvas" Width="{Binding ElementName=topWindow, Path=ActualWidth}" Height="{Binding ElementName=topWindow, Path=ActualHeight}"> 
     ...Content... 
    </Canvas> 
</MyWindow> 

(Как это происходит, я часто связывают сетки. внутри холстов таким образом, так что я могу легко анимировать элементы, перемещающиеся из одной позиции сетки в другую.)