我需要将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());
}
}
}
谢谢!
答案 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吗? (只是一个合乎逻辑的观察)