C# 将子控件添加到WrapPanel

C# 将子控件添加到WrapPanel,c#,wpf,C#,Wpf,我对WPF非常陌生 我有一个非常简单的问题 我有一个stackpanel终端盒 <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="300"/> <ColumnDefinition Width="881*"/> <ColumnDefinition Width="11*"/> </Grid.ColumnDef

我对WPF非常陌生

我有一个非常简单的问题

我有一个stackpanel终端盒

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