将子控件添加到WrapPanel

时间:2013-12-03 11:54:45

标签: c# wpf

我对WPF非常陌生。

我有一个非常简单的问题。

我有一个stackpanel spTerminalBox。

<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区域,那么它不应该超出可见区域,它应该会下降。

如何实现这一目标?

5 个答案:

答案 0 :(得分:22)

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

执行结果:

Wide Narrow

答案 1 :(得分:4)

您应该使用WrapPanel来满足您的要求。

答案 2 :(得分:1)

StackPanel换成ScrollViewer,并在刚刚添加的元素上调用ScrollIntoView()

答案 3 :(得分:1)

而不是使用StackPanel并添加UserControls,而是使用ListBox 绑定到ObservableCollection。 添加/删除项目时,'ObservableCollection'将通知ListBox 将ListBox.ItemsPanel更改为Wrappanel而不是StackPanel

取自http://wpftutorial.net/
"The wrap panel is similar to the StackPanel but it does not just stack all child elements to one row, it wraps them to new lines if no space is left. The Orientation can be set to Horizontal or Vertical."

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

答案 4 :(得分:0)

最好为你的情况使用它有一个附加属性为此准备好但StackPanel将在FIFO中工作

  

DockPanel中

for example 

            Button btn = new Button();
            DockPanel.SetDock(btn,Dock.Bottom);
            dockPanelTerminalBox.Children.Add(btn); 

但是如果你想在你的代码中使用它

spTerminalBox.Children.Add("yourControl");