ListBoxItem中的复杂UI

Fed*_*gui 10 .net c# listbox listboxitem winforms

在WPF中,我可以添加任何UI到ListBoxItem通过提供的S ListBoxItemTemplate:

 <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>
Run Code Online (Sandbox Code Playgroud)

结果是:

在此输入图像描述

有没有办法在Windows窗体中实现相同的功能?

编辑:

1 -有什么办法,以实现在Windows窗体一样,同时保持separation of concerns之间ViewApplication Logic以这样的方式,如果我后来想完全重新定义View,我就不必重构整个应用程序?

2 - winforms是否支持数据绑定,使得我的每一个ListBoxItems都可以绑定到一个复杂的Entity,最终包括从Model数据到UI数据的中间类型转换,然后返回,这样我就不必写入大量的样板代码填充视图,然后将UI值传回模型以便保存?

3 - 如果我想以Animations这样的方式介绍当前SelectedItem会将其自身扩展为某种"行详细信息"模式,您可以在其中看到许多其他信息,该怎么办?

4 - winforms是否UI Virtualization以这样的方式支持,如果我有,说100万个项目,加载UI不需要一辈子,只渲染屏幕上可见的内容?

5 - 说我想在这个等式中引入复杂的图形.winforms渲染硬件加速了吗?

6 - 如何使Resolution IndependentListBox及其所有内容扩展到可用的窗口大小以便利用更大的屏幕同时保持与较小屏幕的兼容性?

7 - 有人建议使用ListView控件而不是常规控件ListBox,是否ListView提供了添加任何UI的功能?我可以为每个项目添加视频吗?或者带有保存和编辑按钮的复杂主/明细模板?

8 - winforms是否提供了一致且充足的文档模型,可以创建高保真的所见即所得文档和其他类型的丰富内容?

Jef*_*eff 21

要回答一个首要问题 - 如何在WinForms中执行此操作 - 我建议如下:

  1. 在WinForms应用程序中使用WPF ListBox,包含在ElementHost中.这有其自身的问题,但我认为这是获得理想效果的最简洁方法.

    如果这不符合法案,那么

  2. 使用具有支持此功能的组件的第三方控件套件(Infragistics和DevExpress都可以).

  3. 旋转您自己的派生ListBox控件,覆盖绘制等,以呈现所需的内容.

针对您的个人问题:

  1. 有没有什么办法,以实现在Windows窗体一样,同时保持separation of concerns之间ViewApplication Logic以这样的方式,如果我后来想完全重新定义View,我就不必重构整个应用程序?
    在过去,我使用了Windows窗体的MVP(模型 - 视图 - 演示者)范例.它适用于将视图与业务逻辑分离,尽管不像使用WPF的MVVM方法那样干净.我能给出的最好建议是:不要将业务逻辑放在事件处理程序中.

  2. winforms是否支持数据绑定,使得我的每一个ListBoxItems都可以绑定到一个复杂的Entity,最终包括从Model数据到UI数据的中间类型转换,然后返回,这样我就不必编写大量的样板代码填充视图然后将UI值传回模型以便保存?
    不可以.Windows窗体数据绑定不支持复杂的数据绑定.你可以通过ICustomTypeDescriptor或IBindingSource自己实现一些东西,它们可以采用复杂的路径并为了绑定目的对它们进行评估......但是没有任何东西可以用于此.

  3. 如果我想以Animations这样的方式介绍当前SelectedItem会将其自身扩展为某种"行详细信息"模式,您可以在其中看到许多其他信息,该怎么办?
    您必须滚动自己的Windows窗体ListBox和ListBoxItems并覆盖绘制操作.

  4. winforms是否UI Virtualization以这样的方式支持,如果我有,说100万个项目,加载UI不需要一辈子,只渲染屏幕上可见的内容?
    不是开箱即用,但是一些第三方控制套件具有支持虚拟化类型的组件......但完全不像WPF那样.

  5. 说我想在这个等式中引入复杂的图形.winforms渲染硬件加速了吗?
    Windows窗体基于GDI +.GDI +不是硬件加速:在Windows7下Windows窗体速度很慢?

  6. 如何使Resolution IndependentListBox及其所有内容扩展到可用的窗口大小以便利用更大的屏幕同时保持与较小屏幕的兼容性?
    您可以使用Windows窗体中的停靠和锚定来完成此操作.或者,您可以添加自定义事件处理程序,以根据分辨率和窗口大小执行适当的布局调整.

  7. 有人建议使用ListView控件而不是常规控件ListBox,是否ListView提供了添加任何UI的功能?我可以为每个项目添加视频吗?或者带有保存和编辑按钮的复杂主/明细模板?
    这简化了......但ListView只是一个支持多种视图类型的ListBox.它在数据绑定方面也更受限制.http://blog.gfader.com/2008/09/winforms-listbox-vs-listview.html.

  8. winforms是否提供了一致且充足的[文档模型] [2],可以创建高保真的所见即所得文档和其他类型的丰富内容?
    一点都不.一点儿都没有.

简而言之,如果它是一个可接受的解决方案,我会将你的WPF ListView包装在ElementHost中并将其称为一天.

  • @HighCore请考虑不回答/评论有关WinForms的问题.这不是分享您对该技术的负面看法的地方.我*同意*与您的意见,记录,但这不是正确的地方分享. (9认同)
  • 我加入#8:听起来@HighCore正在考虑Winforms*非常*与它的设计方式不同.它不是*以文档为中心的模型.虽然它已经有了很大的发展,但Winforms与VB6的工作方式(ed | s)并没有什么不同.越早接受它就越容易使用(或拒绝). (3认同)
  • ...如果确实切换到ListView控件(实际上我会建议这样做,这与您链接的文章的作者的看法相反),则只需设置其[`VirtualMode`属性](http:// msdn。 microsoft.com/en-us/library/system.windows.forms.listview.virtualmode.aspx正是为此目的而设计的。ListViews支持所有者绘制就像ListBoxes一样,因此您可以根据需要对其进行自定义。 (2认同)