Сложный интерфейс внутри 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 - я бы предложил следующее:
Используйте WPF ListBox в вашем приложении WinForms, завернутый в ElementHost. У этого есть свои проблемы, но я думаю, что это самый чистый способ получить желаемый эффект.
если это не отвечает всем требованиям, то
Используйте сторонний пакет управления, который имеет компоненты, которые поддерживают это (Infragistics и DevExpress оба делают).
Вращайте свой собственный производный элемент управления ListBox, который переопределяет рисование и т. Д., Чтобы отобразить желаемый контент.
На ваши индивидуальные вопросы:
Есть ли способ добиться того же в Windows Forms, при этом все
separation of concerns
междуView
иApplication Logic
таким образом, что если бы я позже хотел полностью переопределитьView
Мне не придется рефакторинг всего приложения?
В прошлом я использовал парадигму MVP (модель-представление-презентатор) с Windows Forms. Он работает для отделения представления от бизнес-логики, хотя и не так чисто, как подход MVVM с WPF. Лучший совет, который я могу дать: не помещайте бизнес-логику в обработчики событий.Поддерживает ли winforms привязку данных таким образом, чтобы каждый из моих
ListBoxItems
может быть связано с комплексомEntity
со временем, включая промежуточное преобразование типов из данных модели в данные пользовательского интерфейса и обратно, таким образом, что мне не нужно писать тонны шаблонного кода для заполнения представления, а затем передавать значения пользовательского интерфейса обратно в модель для сохранения?
Нет. Привязка данных Windows Forms не поддерживает сложную привязку данных. Вы можете реализовать что-то самостоятельно через ICustomTypeDescriptor или IBindingSource, который может использовать сложные пути и оценивать их для целей связывания... но для этого ничего не существует из коробки.Что если бы я хотел представить
Animations
таким образом, что в настоящее времяSelectedItem
оживленно развернется в какой-нибудь режим "Детали строки", где вы сможете увидеть много дополнительной информации?
Вам придется свернуть собственные списки Windows Forms ListBox и ListBoxItems и переопределить операции рисования.Поддерживает ли winforms
UI Virtualization
таким образом, что, если у меня есть, скажем, 1 миллион элементов, загрузка пользовательского интерфейса займет не целую жизнь, а отобразит только то, что видно на экране?
Не из коробки, но в некоторых сторонних контрольных пакетах есть компоненты, которые поддерживают типы виртуализации... но совсем не так, как WPF.Скажем, я хотел ввести сложную графику в уравнение. Является ли winforms рендеринг с аппаратным ускорением?
Windows Forms основан на GDI+. GDI+ не аппаратно ускоряется: Windows Forms очень медленно работают под Windows7?Как мне все это сделать
Resolution Independent
таким образом, что ListBox и все его содержимое растягивается до доступного размера окна, чтобы использовать большие экраны при сохранении совместимости с меньшими экранами?
Для этого вы можете использовать закрепление и привязку в Windows Forms. Или вы можете добавить пользовательские обработчики событий для выполнения соответствующих настроек макета в зависимости от разрешения и размера окна.Было предложено использовать
ListView
контроль вместо обычногоListBox
делает лиListView
предоставить возможность добавить любой интерфейс в него? я могу добавить видео например для каждого элемента? или сложный шаблон Master/Detail с кнопками Сохранить и редактировать?
Это упрощает... но ListView - это просто ListBox, который поддерживает несколько типов представлений. Это также более ограничено с точки зрения привязки данных. http://blog.gfader.com/2008/09/winforms-listbox-vs-listview.html.Предоставляет ли winforms согласованную и адекватную [модель документа][2], которая позволяет создавать высококачественные документы WYSIWYG и другие типы расширенного содержимого?
Нет, совсем нет. Даже не немного.
Короче говоря, если это приемлемое решение, я бы обернул ваш WPF ListView в ElementHost и назвал бы его днем.
Мы сделали это с помощью UserControls на прокручиваемой панели. Подготовлен пользовательский элемент управления, в котором есть все элементы управления для редактирования. Добавьте их на прокручиваемую панель, для свойства dosk установлено значение Top. Реализовано поведение выбора элемента путем отслеживания событий фокуса и щелчка на добавленных элементах управления пользователя.