Сложный интерфейс внутри ListBoxItem

В WPF я могу добавить любой пользовательский интерфейс в ListBoxItemс предоставлением ListBox с ItemTemplate:

 <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 Forms?

Редактировать:

1 - Есть ли способ достичь того же в Windows Forms, все при сохранении separation of concerns между View и Application Logic таким образом, что если бы я позже хотел полностью переопределить ViewМне не придется рефакторинг всего приложения?

2 - Winforms поддерживает привязку данных таким образом, что каждый из моих ListBoxItems может быть связано с комплексом Entityсо временем, включая промежуточное преобразование типов из данных модели в данные пользовательского интерфейса и обратно, таким образом, что мне не нужно писать тонны шаблонного кода для заполнения представления, а затем передавать значения пользовательского интерфейса обратно в модель для сохранения?

3 - Что если бы я хотел представить Animations таким образом, что в настоящее время SelectedItem оживленно развернется в какой-нибудь режим "Детали строки", где вы сможете увидеть много дополнительной информации?

4 - поддерживает ли winforms UI Virtualization таким образом, что, если у меня есть, скажем, 1 миллион элементов, загрузка пользовательского интерфейса займет не целую жизнь, а отобразит только то, что видно на экране?

5 - Скажем, я хотел ввести сложную графику в уравнение. Является ли winforms рендеринг с аппаратным ускорением?

6 - Как мне все это сделать Resolution Independent таким образом, что ListBox и все его содержимое растягивается до доступного размера окна, чтобы использовать большие экраны при сохранении совместимости с меньшими экранами?

7 - Было предложено использовать ListView контроль вместо обычного ListBoxделает ли ListView предоставить возможность добавить любой интерфейс в него? я могу добавить видео например для каждого элемента? или сложный шаблон Master/Detail с кнопками Сохранить и редактировать?

8 - Предоставляет ли winforms согласованную и адекватную модель документа, позволяющую создавать высококачественные документы WYSIWYG и другие типы расширенного содержимого?

2 ответа

Решение

Чтобы ответить на всеобъемлющий вопрос - как это сделать в WinForms - я бы предложил следующее:

  1. Используйте WPF ListBox в вашем приложении WinForms, завернутый в ElementHost. У этого есть свои проблемы, но я думаю, что это самый чистый способ получить желаемый эффект.

    если это не отвечает всем требованиям, то

  2. Используйте сторонний пакет управления, который имеет компоненты, которые поддерживают это (Infragistics и DevExpress оба делают).

  3. Вращайте свой собственный производный элемент управления ListBox, который переопределяет рисование и т. Д., Чтобы отобразить желаемый контент.

На ваши индивидуальные вопросы:

  1. Есть ли способ добиться того же в Windows Forms, при этом все separation of concerns между View и Application Logic таким образом, что если бы я позже хотел полностью переопределить View Мне не придется рефакторинг всего приложения?
    В прошлом я использовал парадигму MVP (модель-представление-презентатор) с Windows Forms. Он работает для отделения представления от бизнес-логики, хотя и не так чисто, как подход MVVM с WPF. Лучший совет, который я могу дать: не помещайте бизнес-логику в обработчики событий.

  2. Поддерживает ли winforms привязку данных таким образом, чтобы каждый из моих ListBoxItems может быть связано с комплексом Entity со временем, включая промежуточное преобразование типов из данных модели в данные пользовательского интерфейса и обратно, таким образом, что мне не нужно писать тонны шаблонного кода для заполнения представления, а затем передавать значения пользовательского интерфейса обратно в модель для сохранения?
    Нет. Привязка данных Windows Forms не поддерживает сложную привязку данных. Вы можете реализовать что-то самостоятельно через ICustomTypeDescriptor или IBindingSource, который может использовать сложные пути и оценивать их для целей связывания... но для этого ничего не существует из коробки.

  3. Что если бы я хотел представить Animations таким образом, что в настоящее время SelectedItem оживленно развернется в какой-нибудь режим "Детали строки", где вы сможете увидеть много дополнительной информации?
    Вам придется свернуть собственные списки Windows Forms ListBox и ListBoxItems и переопределить операции рисования.

  4. Поддерживает ли winforms UI Virtualization таким образом, что, если у меня есть, скажем, 1 миллион элементов, загрузка пользовательского интерфейса займет не целую жизнь, а отобразит только то, что видно на экране?
    Не из коробки, но в некоторых сторонних контрольных пакетах есть компоненты, которые поддерживают типы виртуализации... но совсем не так, как WPF.

  5. Скажем, я хотел ввести сложную графику в уравнение. Является ли winforms рендеринг с аппаратным ускорением?
    Windows Forms основан на GDI+. GDI+ не аппаратно ускоряется: Windows Forms очень медленно работают под Windows7?

  6. Как мне все это сделать Resolution Independent таким образом, что ListBox и все его содержимое растягивается до доступного размера окна, чтобы использовать большие экраны при сохранении совместимости с меньшими экранами?
    Для этого вы можете использовать закрепление и привязку в Windows Forms. Или вы можете добавить пользовательские обработчики событий для выполнения соответствующих настроек макета в зависимости от разрешения и размера окна.

  7. Было предложено использовать ListView контроль вместо обычного ListBox делает ли ListView предоставить возможность добавить любой интерфейс в него? я могу добавить видео например для каждого элемента? или сложный шаблон Master/Detail с кнопками Сохранить и редактировать?
    Это упрощает... но ListView - это просто ListBox, который поддерживает несколько типов представлений. Это также более ограничено с точки зрения привязки данных. http://blog.gfader.com/2008/09/winforms-listbox-vs-listview.html.

  8. Предоставляет ли winforms согласованную и адекватную [модель документа][2], которая позволяет создавать высококачественные документы WYSIWYG и другие типы расширенного содержимого?
    Нет, совсем нет. Даже не немного.

Короче говоря, если это приемлемое решение, я бы обернул ваш WPF ListView в ElementHost и назвал бы его днем.

Мы сделали это с помощью UserControls на прокручиваемой панели. Подготовлен пользовательский элемент управления, в котором есть все элементы управления для редактирования. Добавьте их на прокручиваемую панель, для свойства dosk установлено значение Top. Реализовано поведение выбора элемента путем отслеживания событий фокуса и щелчка на добавленных элементах управления пользователя.

Другие вопросы по тегам