我的小程序有很多分类项目。
我们假设我有一个名为 Candy 的类别,而Candy类别中有超过100个。
我在这里查询,
OleDbConnection dbConnect = new OleDBConnection("....");
dbConnect.Open();
string query = "SELECT ID, item FROM Items WHERE category == 'Candy'";
OleDBCommand executeCommand= new OleDBCommand(query, dbConnect);
OleDBDataReader reader = executeCommand.ExecuteReader();
结果可能是很多行,其中每一行都有一个按钮的属性。将生成一个新按钮。
while(reader.Read()) {
// create multiple buttons for each row here..
}
现在问题是,我想在高度和宽度有限的WrapPanel中显示它。 假设我只能在WrapPanel中显示10个按钮。但是创建的按钮超过50个。
解决此问题的最佳方法是什么。我想我是否可以修改10行的查询并创建10个按钮,而另一个按钮 NEXT 箭头将获取另外10个按钮。
我在这里太困惑了。请帮助我找到更好的解决方案。
答案 0 :(得分:4)
如果你让WPF为你管理视图,如果项目的数量没有达到数千,我认为你会更好(代码更少,代码更简单)。如何规划用户浏览按钮?它是滚动条吗?
此外,查看示例代码,您似乎打算在“while”循环内动态创建按钮。同样,虽然这是可能的方式,但这不是“教科书”解决方案或基于集合创建多个项目的简单解决方案。合适的范例是使用数据绑定到项目数组。
以下是一个例子:
在您的XAML文件中,定义< ItemsControl>。给它一个名字(比如ButtonsPanel),这样你就可以从后面的代码中引用它。在后面的代码中准备一个数组(或者List,或者从IEnumerable派生的任何东西)和你想要呈现的所有项目,并将元素的ItemsSource设置为这个列表。
ItemsControl是一个非常通用的Items Control。您可以定义ItemsPanel(即包含所有项目的面板)以及所有按钮的模板。
<ItemsControl x:Name="ButtonsPanel" Height="80" Width="50">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
编辑(来自user995387的评论):
使用Prev / Next按钮(a.k.a. paging),数据绑定也是首选范例。在您的控件(或后面的代码)的数据上下文中有一个ObservableCollection,其中包含您要呈现的10个项目。单击“下一步”按钮,或者替换整个集合,或者集合中的10个项目(清除和10个添加),或者集合中项目的内容(在这种情况下,项目必须触发INotifyPropertyChanged事件) - 对你来说更有意义。仅当创建10个新按钮(而不是更新每个按钮的内容)时才会选择最后一个选项,从而降低性能。