WPF изменяемый размер холста - PullRequest
2 голосов
/ 01 мая 2009

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

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

Ответы [ 3 ]

3 голосов
/ 01 мая 2009

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

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

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

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

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

2 голосов
/ 01 мая 2009

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

0 голосов
/ 02 ноября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...