【发布时间】:2016-06-09 06:31:17
【问题描述】:
我有一个 WrapPanel,按钮以编程方式创建并添加为 WrapPanel 的子项。因此,我想在 WrapPanel 充满按钮(子项)时显示垂直滚动条,以便能够连续添加更多按钮。
如果我们需要显示滚动条,我们必须带上 ScrollViewer 吗?没有ScrollViewer就没有办法了吗?我想要得到的是,因为 WrapPanel 的尺寸很小,所以我希望仅在需要时才显示滚动条(比如充满孩子)。
我的代码很简单,如下所示(WrapPanel 在 Grid 内,Grid 在 TabControl 内)
非常感谢您的卓越表现。
更新:我在网上苦苦寻找解决方案好几天了。我尝试将 WrapPanel 放入 ScrollViewer。但是,虽然我将 VerticalScroll 设置为 auto,但即使 WrapPanel 没有任何子项,也会始终显示垂直滚动条。
此外,当我故意让 WrapPanel 充满子项(按钮)时,ScrollViewer 的垂直滚动条不提供向下滚动的可用性。 WrapPanel 底部的按钮显示剪切等等,我无法向下滚动以查看底部按钮之外的内容。我故意将按钮放置在 WrapPanel 的底线之外。
无论有没有,我都希望仅在需要时显示垂直滚动条(充满子项)。这似乎很容易做到。但是很难让它正常工作。
解决方案:由 Henk Holterman 先生提供
<DropShadowEffect/>
</Button.Effect>
</Button>
<WrapPanel x:Name="WrapPanelGreen" HorizontalAlignment="Left" Height="180" VerticalAlignment="Top" Width="232" UseLayoutRounding="True" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto"/>
</Grid>
</TabItem>
</TabControl>
下面是我的简单代码,它以编程方式制作按钮并添加为 WrapPanel 的子项。
for (int k = 0; k < Overviews.Length; k++)
{
Button btnoverviewcontent = new Button();
ToolTip tt = new ToolTip();
tt.Content = "Press this button if you want to modify or delete.";
btnoverviewcontent.ToolTip = tt;
btnoverviewcontent.Cursor = Cursors.Hand;
SolidColorBrush mySolidColorBrush = new SolidColorBrush();
mySolidColorBrush.Color = Color.FromArgb(255, 101, 173, 241);
btnoverviewcontent.Background = mySolidColorBrush;
btnoverviewcontent.Effect = new DropShadowEffect
{
Color = new Color { A = 255, R = 0, G = 0, B = 0 },
Direction = 315,
ShadowDepth = 5,
Opacity = 1
};
btnoverviewcontent.Padding = new Thickness(3, 3, 3, 3);
btnoverviewcontent.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Stretch;
TextBlock textBlock = new TextBlock()
{
Text = Overviews[k],
TextAlignment = TextAlignment.Left,
TextWrapping = TextWrapping.Wrap,
};
btnoverviewcontent.Content = textBlock;
btnoverviewcontent.BorderThickness = new Thickness(0, 0, 0, 0);
btnoverviewcontent.FontStretch = FontStretches.UltraExpanded;
btnoverviewcontent.Margin = new Thickness(5, 5, 5, 5);
WrapPanelGreen.Children.Add(btnoverviewcontent);
btnoverviewcontent.Click += new RoutedEventHandler(OnOverviewClick);
【问题讨论】:
-
我会引导你到:stackoverflow.com/a/2119243/1723823 这是对 WrapPanel 基本功能的很好的细分,其中包含一些关于如何使用它实现滚动的 cmets。
-
@HenkHolterman,请查看我更新的问题。感谢您的宝贵意见。
-
@TernaryTopiary,非常感谢您的指导。但是,我也评估了链接页面,并在此时再次全面评估。我的问题是儿童(按钮)是以编程方式制作的,儿童的大小根据他们的文本内容而有所不同。因此,我不能采用第二种解决方案。请参阅我更新的问题。