WPF: Как заставить холст автоизменить размер?

Я хотел бы мой 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, хотя он не отсекает своих детей.

43
задан Dave Clemmer 6 September 2013 в 16:47
поделиться

4 ответа

Нет, это невозможно (см. Фрагмент из MSDN ниже). Однако, если вы хотите иметь полосы прокрутки и автоматическое изменение размера, рассмотрите возможность использования вместо этого Grid и используйте свойство Margin для размещения ваших элементов в этой сетке. Grid сообщит ScrollViewer, насколько большим он хочет быть , и вы получите полосы прокрутки .. Canvas всегда будет сообщать ScrollViewer, что ему не нужен какой-либо размер .. :)

Grid позволяет вам наслаждаться обоими мирами - пока вы помещаете все элементы в одну ячейку, вы получаете и то, и другое: произвольное позиционирование и автоматический размер. В целом следует помнить, что большинство элементов управления панелью (DockPanel, StackPanel и т. Д.) Можно реализовать с помощью элемента управления Grid.

Из MSDN :

Canvas - единственный элемент панели, у которого нет присущие компоновочные характеристики. По умолчанию свойства холста и ширины равны нулю, если только он не является дочерним элементом элемента, который автоматически изменяет размеры своих дочерних элементов. Размер дочерних элементов Canvas никогда не изменяется, они просто располагаются в назначенных координатах. Это обеспечивает гибкость в ситуациях, когда внутренние ограничения размеров или выравнивание не нужны или не желательны. В случаях, когда вы хотите, чтобы дочерний контент автоматически изменял размер и выравнивал, обычно лучше использовать элемент Grid.

Надеюсь, это поможет

49
ответ дан 26 November 2019 в 22:36
поделиться

Я вижу, что у вас есть работоспособное решение, но я подумал, что поделюсь.

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

Приведенный выше метод позволит вам вложить сетку внутри холста и иметь динамическое изменение размера. Дальнейшее использование привязки размеров позволяет смешивать динамический материал со статическим материалом, выполнять наслоение и т. Д. Можно упомянуть слишком много возможностей, некоторые из которых сложнее других. Например, я использую подход для имитации перемещения содержимого анимации из одного места сетки в другое - выполняя фактическое размещение в событии завершения анимации. Удачи.

6
ответ дан 26 November 2019 в 22:36
поделиться
<viewbox>
    <canvas>
        <uielements /> 
    </canvas>
</viewbox>
-2
ответ дан 26 November 2019 в 22:36
поделиться

Я думаю, вы можете изменить размер Canvas , переопределив методы MeasureOverride или ArrangeOverride .

Это несложная работа.

Вы можете увидеть этот пост. http://illef.tistory.com/entry/Canvas-supports-ScrollViewer

Надеюсь, это вам поможет.

Спасибо.

10
ответ дан 26 November 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: