C# 将子控件添加到WrapPanel
我对WPF非常陌生 我有一个非常简单的问题 我有一个stackpanel终端盒C# 将子控件添加到WrapPanel,c#,wpf,C#,Wpf,我对WPF非常陌生 我有一个非常简单的问题 我有一个stackpanel终端盒 <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="300"/> <ColumnDefinition Width="881*"/> <ColumnDefinition Width="11*"/> </Grid.ColumnDef
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="300"/>
<ColumnDefinition Width="881*"/>
<ColumnDefinition Width="11*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="156"/>
<RowDefinition Height="371*"/>
</Grid.RowDefinitions>
<my:WindowHeader x:Name="title" Title="Internet Cafe management software (ICM)" CloseClicked="window_CloseClicked" VerticalAlignment="Top" Margin="0,-1,0,0" Grid.ColumnSpan="3" />
<StackPanel Name ="spTerminalBox" Grid.Column="1" Grid.Row="1" Orientation="Horizontal" Margin="10,10,10,20"/>
</Grid>
我的xaml结构就是这样
我在代码中动态填充stackpanel中的用户控件。
如果StackPanel上的子元素不适合StackPanel区域,则它不应超出可见区域,它应下降
如何实现这一点?最好在您的案例中使用它,因为它有一个附加属性可用于此目的,但StackPanel将在FIFO中工作 DockPanel 但是如果你想在你的代码中使用它
spTerminalBox.Children.Add("yourControl");
将您的
StackPanel
包装在ScrollViewer
中,并在刚刚添加的元素上调用ScrollIntoView()
。您应该使用WrapPanel
满足您的需求。XAML:
<Window x:Class="WpfTestBench.PanelSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="PanelSample" Height="300" Width="300">
<Grid>
<WrapPanel Name="MyPanel" />
</Grid>
</Window>
代码隐藏:
using System.Windows;
using System.Windows.Media;
using System.Windows.Shapes;
namespace WpfTestBench
{
public partial class PanelSample
{
public PanelSample()
{
InitializeComponent();
for (var i = 0; i < 5; i++)
{
MyPanel.Children.Add(new Rectangle
{
Width = 100,
Height = 20,
StrokeThickness = 1,
Stroke = new SolidColorBrush(Colors.Black),
Margin = new Thickness(5)
});
}
}
}
}
使用System.Windows;
使用System.Windows.Media;
使用System.Windows.Shapes;
命名空间WpfTestBench
{
公共部分类样本
{
公共面板样本()
{
初始化组件();
对于(变量i=0;i<5;i++)
{
MyPanel.Children.Add(新矩形)
{
宽度=100,
高度=20,
冲程厚度=1,
笔划=新的SolidColorBrush(颜色为黑色),
余量=新厚度(5)
});
}
}
}
}
执行结果:
不要使用
StackPanel
和添加UserControls
而使用ListBox
,您将
绑在一根绳子上。
“ObservableCollection”将在添加/删除项目时通知列表框。将ListBox.ItemsPanel更改为
Wrappanel
而不是StackPanel
摘自“包裹面板类似于StackPanel,但它不只是将所有子元素堆叠到一行,如果没有空间,它会将它们包裹到新行。方向可以设置为水平或垂直。”
您的Xaml应该如下所示:
<ListBox x:Name="MyListBox"
ItemsSource="{Binding Source={StaticResource UserControlsObservableCollection}}"
HorizontalContentAlignment="Stretch"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Disabled" >
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
你所说的“下来”是什么意思?在填充5个控件后,如果没有空间,则第6个控件必须出现在StackPanel的下一行StackPanel不应用于实现你描述的行为。你可以试试WrapPanel或者编写你自己的自定义面板。是的,我做了。问题在于一旦控件超出堆栈面板宽度,它的可见性。我需要它不要超出框。我必须在下面告诉大家,作为一个孩子,我们可以一次添加两个控件(文本框+标签)。在上面的示例中,您添加矩形5次,就像我想添加矩形+标签(作为单个子项)5次一样times@Surya在WPF中,所有控件都可以嵌套。例如,您可以创建另一个stackpanel,将textblock和标签添加到该stackpanel,然后将stackpanel作为单个控件添加到wrappanel。这有意义吗?
<ListBox x:Name="MyListBox"
ItemsSource="{Binding Source={StaticResource UserControlsObservableCollection}}"
HorizontalContentAlignment="Stretch"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Disabled" >
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>