Вопрос

Мне нужно реализовать 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>

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top