0

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

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); 

и это C# код XAML:

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

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

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

+0

Можете ли вы добавить рабочий код при создании всего в XAML? Но в основном StackPanel использует столько места, сколько требуется, поэтому ScrollViewer в StackPanel никогда не должен работать, если я не ошибаюсь ... – schumi1331

+0

В этом проблема, проклятая StackPanel ... Если я изменю ее на Grid, все работает отлично! – CarlosTI

ответ

0

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

<StackPanel x:Name="stkPanel" isVerticalScrollEnabled = "true" MaxHeight="300"> 
</StackPanel> 
1

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

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

+0

Какова ваша польза от размещения Pivot в StackPanel вместо Grid? – schumi1331

+0

, в моем случае элементы создаются динамически с ответом webService и имеют много типов, таких как свод, текстовое поле и т. Д. Поэтому мне нужен контейнер (Stackpanel или Grid или любой другой контейнер), чтобы размещать элементы один под другим, поэтому проще разместить их в Stackpanel, чем в Grid (в которой вам нужно установить номер строки каждого элемента). Во всяком случае, я перекодировал функцию для использования Grid и отлично работает! – CarlosTI

+0

Я вижу. Может быть, использование RelativePanel и свойств ниже будет вариантом в следующий раз? – schumi1331

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

     pivot.Items.Add(pivotItem); 

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

     scrollViewer.Content = stackContent; 
     Window.Current.Activate(); 
     var bounds = ApplicationView.GetForCurrentView().VisibleBounds; 
     scrollViewer.Height = bounds.Height; 
     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); 
+0

Вы протестировали это решение? Я сделал, но, похоже, не работает :(Как я уже сказал в превиусе кометы, похоже, что он имеет отношение к стеке – CarlosTI

Смежные вопросы