在运行时动态创建多个 UI 元素 - C# WPF
Creating multiple UI Elements dynamically during runtime - C# WPF
我对 C# 和 WPF 还很陌生,但我开始构建一个应用程序,它应该具有列出项目和一些细节的功能。目前它看起来像
这些 'items' 的数据(一个项目是用边框包围的多个标签(稍后我也想添加一张图片))是通过 REST 服务加载的,我不不知道会回复多少项目。现在我遇到了无法在 xaml 中静态创建标签的问题,因为收到的项目数量不同。
我的问题是,如何以编程方式创建多个标签(以及边框和图像),在 window 中正确对齐它们并解决标签以填充数据?
非常感谢您的帮助!
正如您在评论中指出的那样,ListBox
可能适合您的目的。一般的想法是,您想通过 ItemTemplate
指定 ListBox
的格式,并在 ItemTemplate
中指定带有必要控件的 DataTemplate
来支持您的 API 数据,绑定指定到从 JSON 映射的模型。 XAML 的不完整示例:
<ListBox x:Name="transactionsListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness=".5" Padding="1">
<StackPanel>
<Label x:Name="id" Content="{Binding Path=Id}" />
<Label x:Name="item_id" Content="{Binding Path=Item_Id}" />
<Label x:Name="price" Content="{Binding Path=Price}" />
<Label x:Name="quantity" Content="{Binding Path=Quantity}" />
<Label x:Name="created" Content="{Binding Path=Created}" />
<Label x:Name="purchased" Content="{Binding Path=Purchased}" />
</StackPanel>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
上述绑定的 Path= 属性 需要匹配您创建的模型的 属性 名称,以存储来自 REST 调用的事务。然后,当您拥有该模型类型的列表实例时,您的代码会想要执行如下操作:
List<Transaction> myTransactions = apiCall.response.mapToMyModel() // pseduocode
transactionsListBox.DataContext = myTransactions;
为了补充 Bobby 的回答,这里有一个使用 ItemsControl
的例子。
<ItemsControl ItemsSource="{Binding SellTransactions}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="{Binding created}"></Label>
<Label Grid.Column="1" Content="{Binding id}"></Label>
<Label Grid.Column="2" Content="{Binding item_id}"></Label>
<Label Grid.Column="3" Content="{Binding price}"></Label>
<Label Grid.Column="4" Content="{Binding purchased}"></Label>
<Label Grid.Column="5" Content="{Binding quantity}"></Label>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
交易的class:
public class SellTransaction
{
public long id { get; set; }
public int item_id { get; set; }
public int price { get; set; }
public int quantity { get; set; }
public DateTime created { get; set; }
public DateTime purchased { get; set; }
}
我对 C# 和 WPF 还很陌生,但我开始构建一个应用程序,它应该具有列出项目和一些细节的功能。目前它看起来像
这些 'items' 的数据(一个项目是用边框包围的多个标签(稍后我也想添加一张图片))是通过 REST 服务加载的,我不不知道会回复多少项目。现在我遇到了无法在 xaml 中静态创建标签的问题,因为收到的项目数量不同。
我的问题是,如何以编程方式创建多个标签(以及边框和图像),在 window 中正确对齐它们并解决标签以填充数据?
非常感谢您的帮助!
正如您在评论中指出的那样,ListBox
可能适合您的目的。一般的想法是,您想通过 ItemTemplate
指定 ListBox
的格式,并在 ItemTemplate
中指定带有必要控件的 DataTemplate
来支持您的 API 数据,绑定指定到从 JSON 映射的模型。 XAML 的不完整示例:
<ListBox x:Name="transactionsListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness=".5" Padding="1">
<StackPanel>
<Label x:Name="id" Content="{Binding Path=Id}" />
<Label x:Name="item_id" Content="{Binding Path=Item_Id}" />
<Label x:Name="price" Content="{Binding Path=Price}" />
<Label x:Name="quantity" Content="{Binding Path=Quantity}" />
<Label x:Name="created" Content="{Binding Path=Created}" />
<Label x:Name="purchased" Content="{Binding Path=Purchased}" />
</StackPanel>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
上述绑定的 Path= 属性 需要匹配您创建的模型的 属性 名称,以存储来自 REST 调用的事务。然后,当您拥有该模型类型的列表实例时,您的代码会想要执行如下操作:
List<Transaction> myTransactions = apiCall.response.mapToMyModel() // pseduocode
transactionsListBox.DataContext = myTransactions;
为了补充 Bobby 的回答,这里有一个使用 ItemsControl
的例子。
<ItemsControl ItemsSource="{Binding SellTransactions}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="{Binding created}"></Label>
<Label Grid.Column="1" Content="{Binding id}"></Label>
<Label Grid.Column="2" Content="{Binding item_id}"></Label>
<Label Grid.Column="3" Content="{Binding price}"></Label>
<Label Grid.Column="4" Content="{Binding purchased}"></Label>
<Label Grid.Column="5" Content="{Binding quantity}"></Label>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
交易的class:
public class SellTransaction
{
public long id { get; set; }
public int item_id { get; set; }
public int price { get; set; }
public int quantity { get; set; }
public DateTime created { get; set; }
public DateTime purchased { get; set; }
}