Я хотел бы мой Canvas
автоматически изменить размер к размеру его объектов, так, чтобы ScrollViewer
полосы прокрутки имеют корректный диапазон. Это может быть сделано в XAML?
<ScrollViewer HorizontalScrollBarVisibility="Auto" x:Name="_scrollViewer">
<Grid x:Name ="_canvasGrid" Background="Yellow">
<Canvas x:Name="_canvas" HorizontalAlignment="Left" VerticalAlignment="Top" Background="Green"></Canvas>
<Line IsHitTestVisible="False" .../>
</Grid>
</ScrollViewer>
В вышеупомянутом коде холст всегда имеет размер 0, хотя он не отсекает своих детей.
Нет, это невозможно (см. Фрагмент из MSDN ниже). Однако, если вы хотите иметь полосы прокрутки и автоматическое изменение размера, рассмотрите возможность использования вместо этого Grid и используйте свойство Margin для размещения ваших элементов в этой сетке. Grid сообщит ScrollViewer, насколько большим он хочет быть , и вы получите полосы прокрутки .. Canvas всегда будет сообщать ScrollViewer, что ему не нужен какой-либо размер .. :)
Grid позволяет вам наслаждаться обоими мирами - пока вы помещаете все элементы в одну ячейку, вы получаете и то, и другое: произвольное позиционирование и автоматический размер. В целом следует помнить, что большинство элементов управления панелью (DockPanel, StackPanel и т. Д.) Можно реализовать с помощью элемента управления Grid.
Из MSDN :
Canvas - единственный элемент панели, у которого нет присущие компоновочные характеристики. По умолчанию свойства холста и ширины равны нулю, если только он не является дочерним элементом элемента, который автоматически изменяет размеры своих дочерних элементов. Размер дочерних элементов Canvas никогда не изменяется, они просто располагаются в назначенных координатах. Это обеспечивает гибкость в ситуациях, когда внутренние ограничения размеров или выравнивание не нужны или не желательны. В случаях, когда вы хотите, чтобы дочерний контент автоматически изменял размер и выравнивал, обычно лучше использовать элемент Grid.
Надеюсь, это поможет
Я вижу, что у вас есть работоспособное решение, но я подумал, что поделюсь.
<Canvas x:Name="topCanvas">
<Grid x:Name="topGrid" Width="{Binding ElementName=topCanvas, Path=ActualWidth}" Height="{Binding ElementName=topCanvas, Path=ActualHeight}">
...Content...
</Grid>
</Canvas>
Приведенный выше метод позволит вам вложить сетку внутри холста и иметь динамическое изменение размера. Дальнейшее использование привязки размеров позволяет смешивать динамический материал со статическим материалом, выполнять наслоение и т. Д. Можно упомянуть слишком много возможностей, некоторые из которых сложнее других. Например, я использую подход для имитации перемещения содержимого анимации из одного места сетки в другое - выполняя фактическое размещение в событии завершения анимации. Удачи.
<viewbox>
<canvas>
<uielements />
</canvas>
</viewbox>
Я думаю, вы можете изменить размер Canvas
, переопределив методы MeasureOverride
или ArrangeOverride
.
Это несложная работа.
Вы можете увидеть этот пост. http://illef.tistory.com/entry/Canvas-supports-ScrollViewer
Надеюсь, это вам поможет.
Спасибо.