WPF изменяемый размер холста
Вопрос
Мне нужно реализовать Canvas
, который масштабирует его содержимое в соответствии с его размером. Я знаю, что есть Viewbox
, который масштабирует все внутри него. Однако я не могу использовать это, потому что некоторые элементы имеют фиксированный размер и не могут быть масштабированы.
Также, как я могу привязать размер Canvas
к родительскому элементу (например, окно с изменяемым размером). Для окон есть sizeToContent, я хочу, чтобы размер соответствовал разному. Также холст использует некоторый рисунок, основанный на размере элемента хостинга, как запускается перерисовка и как я могу гарантировать, что он рисует, только если он получает действительный (или минимальный) размер?
Решение
Если вы не указываете ширину или высоту холста, он автоматически использует все доступное пространство. Это связано с тем, что для VerticalAlignment
и HorizontalAlignment
по умолчанию установлено значение Stretch
.
Что вы подразумеваете под холстом, который масштабирует его содержимое в соответствии с его размером, не масштабируя все содержимое, поскольку некоторые имеют фиксированный размер?
Обновление после комментариев
Если ваш алгоритм рисования уже масштабирует содержимое до высоты и ширины холста, то все, что вам нужно сделать, это изменить размер холста, чтобы он соответствовал области, которой я верю? В этом случае просто удалите жестко запрограммированные значения высоты / ширины, и холст изменится в соответствии с размером контейнера.
Возможно, после этого вам может потребоваться использовать ActualHeight / ActualWidth вместо Height / Width в алгоритме рисования. ActualHeight / ActualWidth возвращают значения, которые контейнер макета даст вашему холсту, чтобы они представляли значения, с которыми нарисован холст.
Другие советы
Я думаю, что вы можете найти ответы на все ваши вопросы в моем Демонстрация лондонского метро .
Я делаю это из памяти, но если я правильно помню, 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>
(Как это часто бывает, я часто таким образом связываю сетки внутри холстов, поэтому могу легко анимировать элементы, перемещающиеся из одной позиции сетки в другую.)