ListBoxItem中的复杂UI
在WPF中,我可以通过向ListBox
提供一个ItemTemplate
来将任何UI添加到ListBoxItem
:
<ListBox ItemsSource="{Binding}"> <ListBox.ItemTemplate> <DataTemplate> <Border BorderThickness="1" BorderBrush="Gray" CornerRadius="8" Padding="4,0,4,0"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="50"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <CheckBox Grid.Column="1" Content="Is Active Customer" IsChecked="{Binding IsActive}"/> <Label Content="Id:" Grid.Row="1" HorizontalAlignment="Right"/> <Label Content="Name:" Grid.Row="2" HorizontalAlignment="Right"/> <TextBox Text="{Binding Id}" Grid.Row="1" Grid.Column="1"/> <TextBox Text="{Binding Name}" Grid.Row="2" Grid.Column="1"/> </Grid> </Border> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
结果是:
有没有什么办法可以在Windows窗体中实现相同的function?
编辑:
1 – 有没有什么办法可以在Windows窗体中实现同样的效果,同时保持View
和Application Logic
之间的separation of concerns
点separation of concerns
这样,如果我后来想彻底重新定义View
,我不必重构整个申请?
2 – winforms是否支持数据绑定,使我的每个ListBoxItems
都可以绑定到一个复杂的Entity
,最终包括从Model数据到UI数据的中间types转换,并以这种方式,我不必写吨的样板代码来填充视图,然后将UI值传回模型以保存?
3 – 如果我想引入Animations
,那么当前的SelectedItem
会自动将其展开为某种“行详细信息”模式,您可以在其中看到许多其他信息?
4 – winforms是否支持UI Virtualization
,如果我有,说100万个项目,它不需要一生的时间来加载用户界面,只呈现什么是可见的屏幕上?
5 – 说我想介绍复杂的graphics的方程。 winforms渲染硬件加速?
6 – 如何使Resolution Independent
以这种方式使ListBox及其所有内容扩展到可用的窗口大小,以便在保持与较小屏幕的兼容性的同时利用大屏幕?
7 – 有人build议使用ListView
控件而不是常规的ListBox
, ListView
提供了添加任何UI的能力? 我可以为每个项目添加video吗? 或一个复杂的主/细节模板与保存和编辑button?
8 – winforms是否提供了一个一致和充分的文档模型 ,使创build高保真所见即所得的文件和其他types的丰富的内容?
要回答总体问题 – 如何在WinForms中做到这一点 – 我会build议如下:
-
在你的WinForms应用程序中使用一个WPF列表框,包装在一个ElementHost中。 这有它自己的问题,但我认为这是达到预期效果的最干净的方法。
如果这不符合法案,那么
-
使用具有支持此组件的第三方控件套件(Infragistics和DevExpress均可)。
-
旋转你自己派生的ListBox控件,覆盖paint等来渲染所需的内容。
针对您的个人问题:
-
有没有什么办法可以在Windows窗体中实现同样的function,同时保持
View
与Application Logic
之间的separation of concerns
点separation of concerns
这样,如果我以后想彻底重新定义View
,我不必重构整个应用程序?
过去,我使用Windows Forms的MVP(model-view-presenter)模式。 它用于从业务逻辑中分离视图,尽pipe不像WPF的MVVM方法那么干净。 我可以给出的最好的build议是:不要把业务逻辑放在事件处理程序中。 -
是否winforms支持数据绑定的方式,我的每个
ListBoxItems
可以绑定到一个复杂的Entity
,最终包括从模型数据到UI数据的中间types转换和返回,这样,我不必写吨样板代码来填充视图,然后将UI值传回模型中以保存?
Windows窗体数据绑定不支持复杂的数据绑定。 你可以通过ICustomTypeDescriptor或者IBindingSource自己实现一些东西,这些东西可以采取复杂的path并且为了绑定的目的而对它们进行评估……但是没有任何东西存在于这个框中。 -
如果我想引入
Animations
,那么当前的SelectedItem
会dynamic地将其展开为某种“行详细信息”模式,您可以在其中看到许多其他信息?
你将不得不推出自己的Windows窗体ListBox和ListBoxItems并重写绘制操作。 -
winforms是否支持
UI Virtualization
,如果我有,说100万个项目,它不需要一生的时间来加载用户界面,只渲染屏幕上可见的东西?
不是开箱即用,但一些第三方控制套件具有支持虚拟化types的组件,但是完全不像WPF那样。 -
假设我想将复杂的graphics引入方程式。 winforms渲染硬件加速?
Windows窗体基于GDI +。 GDI +不是硬件加速: 在Windows7下Windows窗体非常慢? -
我如何使这个
Resolution Independent
,使列表框及其所有内容扩展到可用的窗口大小,以利用更大的屏幕,同时保持兼容性较小的?
您可以在Windows窗体中使用“停靠”和“锚定”来完成此操作。 或者您可以添加自定义事件处理程序,根据分辨率和窗口大小执行适当的布局调整。 -
有人build议使用
ListView
控件而不是常规的ListBox
,ListView
提供了添加任何UI的能力? 我可以为每个项目添加video吗? 或一个复杂的主/细节模板与保存和编辑button?
这简化了…但是ListView只是一个支持多种视图types的ListBox。 在数据绑定方面也更加有限。 http://blog.gfader.com/2008/09/winforms-listbox-vs-listview.html 。 -
winforms是否提供了一个一致且充分的[文档模型] [2],能够创build高保真所见即所得文档和其他types的丰富内容?
一点都不。 甚至没有一点点。
简而言之,如果这是一个可以接受的解决scheme,我会将你的WPF ListView包裹在一个ElementHost中,然后每天给它打电话。
我们通过在可滚动面板中使用UserControl来完成此操作。 准备一个拥有所有编辑控件的用户控件。 将它们添加到可滚动面板,并将dosk属性设置为Top。 通过观看添加的用户控制项目上的焦点和点击事件来实现项目select行为。