C# ScrollView在动态创建的元素中不起作用
我需要以友好的方式创建一些框架元素。我有一个StackPanel,我在它里面创建了一个枢轴,有一个PivotItem,在一个ScrollViewer里面创建了一个StackPanel和按钮,如下所示:C# ScrollView在动态创建的元素中不起作用,c#,uwp,win-universal-app,windows-10-universal,frameworkelement,C#,Uwp,Win Universal App,Windows 10 Universal,Frameworkelement,我需要以友好的方式创建一些框架元素。我有一个StackPanel,我在它里面创建了一个枢轴,有一个PivotItem,在一个ScrollViewer里面创建了一个StackPanel和按钮,如下所示: Pivot pivot = new Pivot(); PivotItem pivotItem = new PivotItem(); pivot.Items.Add(pivotItem); ScrollViewer scrollViewer = new ScrollViewer(); Stack
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进行“充电”以使滚动工作。您需要将IsVerticalScrollEnabled设置为true,从而为元素提供MaxHeight 但更好的解决方案是ListView或GridView为它们提供最大高度属性,然后您希望滚动条出现
<StackPanel x:Name="stkPanel" isVerticalScrollEnabled = "true" MaxHeight="300">
</StackPanel>
问题出在StackPanel上。正如Schumi1331所说,堆栈面板使用了它所需要的空间,son从来没有定义宽度或高度,scrollViewer也没有像预期的那样工作。如果我按网格进行更改,效果很好
另一个解决方案是,在插入dinnamics元素后,计算使用这些元素的空间大小,并设置StackPanel的高度。在XAML中创建所有内容时,您是否可以添加工作代码?但是基本上StackPanel使用了它所需要的空间,所以如果我没有错的话,StackPanel中的ScrollViewer就永远不会工作…这就是问题所在,该死的StackPanel。。。如果我改变它的网格,所有的工作都很好!将Pivot放在StackPanel而不是网格中有什么好处?在我的例子中,元素是通过webService的响应动态创建的,有很多类型,如Pivot、textbox等。因此我需要一个容器(StackPanel或网格或任何其他容器)将元素一个放置在另一个之下,所以,将它们放在Stackpanel中比放在网格中更容易(在网格中,您需要设置每个元素的行数)。无论如何,我已经重新编码了使用网格的函数,并且工作得很好!我懂了。也许下次可以选择使用RelativePanel和以下属性?您测试过此解决方案吗?我做到了,但似乎不起作用:(正如我在previus commets中所说的,它似乎与StackPanel有关
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);