10

ListBoxItem在 WPF 中,我可以通过向 s 提供以下内容来将任何 UI 添加到sListBoxItemTemplate

 <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 窗体中实现相同的功能吗?

编辑:

1 - 有什么方法可以在 Windows 窗体中实现相同的功能,同时保持和separation of concerns之间的方式,如果我以后想完全重新定义,我不必重构整个应用程序?ViewApplication LogicView

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

3 - 如果我想以Animations这样一种方式进行介绍,即当前SelectedItem会以动画方式将自身扩展为某种“行详细信息”模式,您可以在其中看到很多附加信息,该怎么办?

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

5 - 假设我想在方程式中引入复杂的图形。winforms渲染硬件加速吗?

6 - 我如何Resolution Independent以这样一种方式进行所有这些操作,使 ListBox 及其所有内容拉伸到可用的窗口大小,以便在保持与较小屏幕的兼容性的同时利用更大的屏幕?

7 - 建议使用ListView控件而不是常规控件ListBox,是否ListView提供向其中添加任何 UI 的能力?例如,我可以为每个项目添加视频吗?还是带有保存和编辑按钮的复杂主/详细模板?

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

4

2 回答 2

21

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

  1. 在您的 WinForms 应用程序中使用 WPF ListBox,包装在 ElementHost 中。这有其自身的问题,但我认为这是获得预期效果的最干净的方法。

    如果这不符合要求,那么

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

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

对于您的个人问题:

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

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

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

  4. winforms 是否支持UI Virtualization这样一种方式,如果我有,比如说 100 万个项目,它不需要一生来加载 UI,并且只渲染屏幕上可见的内容?
    不是开箱即用,但一些第三方控制套件具有支持虚拟化类型的组件......但与 WPF 所做的完全不同。

  5. Say I wanted to introduce complex graphics to the equation. Is winforms rendering hardware-accelerated?
    Windows Forms is based on GDI+. GDI+ is not hardware accelerated: Windows Forms very slow under Windows7?

  6. How do I make all this Resolution Independent in such a way that the ListBox and all its contents stretch to the available window size in order to leverage larger screens while maintaining compatibility with smaller ones?
    You can use Docking and Anchoring in Windows Forms to accomplish this. Or you can add custom event handlers to perform appropriate layout adjustments based on resolution and Window size.

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

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

简而言之,如果这是一个可接受的解决方案,我会将您的 WPF ListView 包装在 ElementHost 中,然后就这样结束了。

于 2013-03-23T06:20:54.980 回答
1

我们通过在可滚动面板中使用 UserControls 来做到这一点。准备了一个包含所有编辑控件的用户控件。将它们添加到 dosk 属性设置为 Top 的可滚动面板。通过观察添加的用户控件项上的焦点和单击事件来实现项选择行为。

于 2013-03-27T14:27:11.463 回答