Silverlight 2中的动态网格使用C#

时间:2009-02-11 22:41:14

标签: c# silverlight-2.0

我需要将UIElements插入到运行时才生成的网格中。更具体地说,我需要在确定需要显示多少元素后,将UIElements添加到我创建的RowDefinitions中。有没有办法控制Grid.Row和Grid.Column以及Grid.RowSpan,就像在XAML中为C#中的对象一样?如果我错了,请告诉我。我不能使用StackPanel(我正在创建一个动态的手风琴面板,它与动画混淆)。

现在发生的事情是我在运行时生成RowDefinitions的数量并将UIElements添加为子节点。这不起作用,所有UIElements最终都在第一行中彼此叠加。

这是我正在尝试的一个例子:

public partial class Page : UserControl
{
    string[] _names = new string[] { "one", "two", "three" };
    public Page()
    {
        InitializeComponent();
        BuildGrid();
    }
    public void BuildGrid()
    {
        LayoutRoot.ShowGridLines = true;
        foreach (string s in _names)
        {
            LayoutRoot.RowDefinitions.Add(new RowDefinition());
            LayoutRoot.Children.Add(new Button());
        }
    }
}

谢谢!

3 个答案:

答案 0 :(得分:3)

除了Grid不是正确的工作工具(ListView会是),你需要告诉Button它属于哪一行。

public void BuildGrid()
{
    LayoutRoot.ShowGridLines = true;
    int rowIndex = 0;
    foreach (string s in _names)
    {
        LayoutRoot.RowDefinitions.Add(new RowDefinition());
        var btn = new Button()
        LayoutRoot.Children.Add(btn);
        Grid.SetRow(btn, rowIndex);
        rowIndex += 1;
    }
}

答案 1 :(得分:2)

做你想要的最好方法是遵循以下模式:

Page.xaml:

<UserControl x:Class="SilverlightApplication1.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
    Width="400" Height="300">
    <Grid x:Name="LayoutRoot" Background="White">
        <data:DataGrid x:Name="DataGridTest" />
    </Grid>
</UserControl>

Page.xaml.cs:

public partial class Page : UserControl
    {
        string[] _names = new string[] { "one", "two", "three" };

        public Page()
        {
            InitializeComponent();
            BuildGrid();
        }

        public void BuildGrid()
        {
            DataGridTest.ItemsSource = _names;
        }
    }

这将根据字符串数组的内容动态构建行。将来,更好的方法是使用ObservableCollection,其中T实现INotifyPropertyChanged。如果您从集合中删除或添加项目以及T的属性发生更改时,这将通知DataGrid更新它的行。

要进一步自定义用于显示内容的UIElements,您可以使用DataGridTemplateColumn

<data:DataGridTemplateColumn Header="Symbol">
    <data:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding PutNameOfPropertyHere}" />
        </DataTemplate>
    </data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>

答案 2 :(得分:0)

我从来没有使用过这个东西,但你不应该把Button添加到RowDefinitions而不是Children吗? (只是一个合乎逻辑的观察)