ScrollView не работает внутри динамически созданного элемента

Мне нужно динамически создать некоторые FrameworkElements. У меня есть StackPanel, и я создаю внутри него Pivot с одним PivotItem и внутри ScrollViewer с StackPanel и кнопками, например так:

Pivot pivot = new Pivot();
PivotItem pivotItem = new PivotItem();

pivot.Items.Add(pivotItem);

ScrollViewer scrollViewer = new ScrollViewer();
StackPanel stackContent = new StackPanel();

scrollViewer.Content = stackContent;

pivotItem.Content = scrollViewer;

stackContent.Children.Add(new Button() { Content = "button 1" });
stackContent.Children.Add(new Button() { Content = "button 2" });
stackContent.Children.Add(new Button() { Content = "button 3" });
stackContent.Children.Add(new Button() { Content = "button 4" });
stackContent.Children.Add(new Button() { Content = "button 5" });
stackContent.Children.Add(new Button() { Content = "button 6" });
stackContent.Children.Add(new Button() { Content = "button 7" });
stackContent.Children.Add(new Button() { Content = "button 8" });
stackContent.Children.Add(new Button() { Content = "button 9" });
stackContent.Children.Add(new Button() { Content = "button 10" });
stackContent.Children.Add(new Button() { Content = "button 11" });

stkPanel.Children.Add(pivot);

и это код С# XAML:

<StackPanel x:Name="stkPanel">
</StackPanel>

Если я попытаюсь создать все элементы в XAML, ScrollViewer будет работать, как и ожидалось, но мне нужно создавать их динамически, когда на странице происходят какие-то события.

Проверяя страницу в отладке, PivotItem имеет «ActualHeight == 0», поэтому я предполагаю, что ScrollViewer внутри нее не работает по этой причине, но я не знаю, как это исправить, может быть, как-то сказать ScrollViewer «подзарядить себя» чтобы прокрутка работала.


person CarlosTI    schedule 21.01.2017    source источник
comment
Можете ли вы добавить рабочий код при создании всего в XAML? Но в основном StackPanel использует столько места, сколько требуется, поэтому ScrollViewer в StackPanel никогда не должен работать, если я не ошибаюсь...   -  person DevAttendant    schedule 22.01.2017
comment
Вот в чем проблема, проклятый StackPanel... Если поменять на Grid, то все нормально работает!   -  person CarlosTI    schedule 23.01.2017


Ответы (3)


Проблема в StackPanel. Как сказал Schumi1331, панель стека использует столько места, сколько ей требуется, сын никогда не имеет определенной ширины или высоты, а scrollViewer не работает должным образом. Если я меняю сетку, работает нормально.

Другим решением является вычисление после вставки динамических элементов того, сколько места занимают эти элементы, и установка высоты для StackPanel.

person CarlosTI    schedule 23.01.2017
comment
В чем преимущество размещения Pivot в StackPanel вместо Grid? - person DevAttendant; 23.01.2017
comment
в моем случае элементы создаются динамически с ответом webService и имеют много типов, таких как свод, текстовое поле и т. д. Поэтому мне нужен контейнер (Stackpanel или Grid или любой другой контейнер), чтобы разместить элементы один под другим, так что это проще разместить их в Stackpanel, чем в сетке (в которой вам нужно установить номер строки для каждого элемента). Во всяком случае, я перекодировал функцию для использования сетки и отлично работает! - person CarlosTI; 23.01.2017
comment
Понимаю. Может быть, в следующий раз можно будет использовать RelativePanel и свойства Below? - person DevAttendant; 23.01.2017

Вам нужно установить для IsVerticalScrollEnabled значение true, чтобы дать вашему элементу MaxHeight, но лучшим решением будет ListView или GridView, дающие им атрибут Max Height, после которого вы хотите, чтобы полоса прокрутки отображалась.

    <StackPanel x:Name="stkPanel" isVerticalScrollEnabled = "true" MaxHeight="300"> 
</StackPanel>
person Viral Parmar    schedule 22.01.2017

person    schedule
comment
Вы тестировали это решение? Я сделал, но, похоже, не работает :( Как я уже сказал в предыдущем комментарии, кажется, что это связано со стековыми панелями. - person CarlosTI; 26.01.2017