В WPF (или silverlight или WP7) должна ли стена для картин выводиться из ItemsControl или Panel? - PullRequest
5 голосов
/ 09 июня 2011

Предположим, мне нужно создать класс с именем PictureWall, который будет использоваться для показа изображений.

Теперь я обнаружил, что Panel и ItemsControl могут использоваться для хранения дочерних элементов. Так должен ли класс PictureWall наследоваться от Panel? или он должен быть производным от ItemsControl.

Примечание: это не реальное требование, это просто гипотетический вопрос. Реальный вопрос заключается в следующем: когда я должен создать подкласс Control (или ItemsControl) и когда я должен создать подкласс Panel?

Примечание 2: Это воображаемое управление настенной панелью не должно использоваться только в одном приложении. Может использоваться другими разработчиками. Если он получен из Panel или ItemsControl, он предоставит свойство с именем Children другим разработчикам. Так что в этом случае лучше использовать производную от Control, верно?

Примечание 3: Этот воображаемый элемент управления настенной панелью имеет свой собственный способ загрузки определенных картинок по умолчанию (например, извлечение картинок с сервера), и он не хочет, чтобы этот способ был испорчен. Если это так, то мы не должны наследовать ItemsControl, верно?

Ответы [ 2 ]

5 голосов
/ 09 июня 2011

Панель - это контейнер, который используется для размещения его дочерних элементов. Например: Сетка с заголовком и одной кнопкой внизу и изображением в центре - Сетка очень гибкая, чтобы помочь вам перемещать объекты и упорядочивать их при изменении размера окна и т. Д.

ItemsControl - это элемент управления, который поможет вам с коллекцией предметов. Давайте рассмотрим конкретный пример: список. Вы можете очень легко показать список элементов, применить шаблон ко всем из них и так далее.

Класс управления - это элемент пользовательского интерфейса, который может иметь собственный шаблон.

Обратите внимание, что гораздо лучше определить собственный UserControl, отредактировать шаблон или стиль вашего PictureWall, используя подклассы (есть много преимуществ, например, вы можете использовать Blend для переопределения стиля).

Edit:

@ note2

На вашем месте я бы создал свой собственный пользовательский элемент управления, чтобы повторно использовать существующие элементы управления для создания того, что я хочу. Если этого будет недостаточно, я бы создал подкласс Control.

[StyleTypedProperty(Property = "FooStyle", StyleTargetType = typeof(Control))]
public partial class MyDangControl: Control
{
 ...

@ note3

Это плохая идея объединять все в одно. Вы должны разделить логику извлечения данных из Picture Wall. Например, пользователь нажимает миниатюру, чтобы загрузить изображение, и весь пользовательский интерфейс зависает. Ужасный UX.

Чтобы быть кристально чистым, позвольте мне процитировать Pro WPF в C # 2010

Контроль

Это самый распространенный старт точка при построении контроля с нуля. Это базовый класс для все пользовательские интерактивные виджеты. Класс управления добавляет свойства для установка фона и переднего плана, а также шрифт и выравнивание содержание. Класс управления также размещает сам в порядке вкладок (через IsTabStop) и представляет понятие двойного щелчка (через MouseDoubleClick и События PreviewMouseDoubleClick). Но самое главное, класс управления определяет свойство шаблона, которое позволяет менять его внешний вид с настроенным деревом элементов для бесконечная гибкость.

ContentControl

Это базовый класс для элементов управления который может отображать один кусок произвольный контент. Этот контент может быть элемент или пользовательский объект, который используется в сочетании с шаблоном. (Контент устанавливается через Свойство содержимого и необязательный шаблон может быть предоставлен в Свойство ContentTemplate.) Многие контролирует обертку определенного, ограниченного типа содержания (как строка текста в текстовое окно). Потому что эти элементы управления не поддерживают все элементы, они не должен быть определен как содержание контроля.

ItemsControl

ItemsControl - базовый класс для элементы управления, которые обертывают список элементов, но не поддерживает выбор, в то время как Селектор является более специализированной базой класс для элементов управления, которые поддерживают выбор. Эти классы не часто используется для создания пользовательских элементов управления, потому что особенности шаблонов данных ListBox, ListView и TreeView обеспечить большую гибкость.

панель

Это базовый класс для элементов управления с макетом логики. Элемент управления макетом может содержать несколько детей и упорядочивает их в соответствии с конкретными семантика макета. Часто панели включить прикрепленные свойства, которые могут быть настроенным на детей, чтобы настроить как устроены дети.

2 голосов
/ 09 июня 2011

Они оба могут использоваться для отображения элементов, но на самом деле ItemsControl предлагает гораздо больше функциональности. Кроме того, ItemsControl на самом деле не отображает свои элементы, он использует Panel для этого.

ItemsControl может отображать список элементов, которые могут быть или не быть элементами UIElements / Visuals. Элементы могут быть шаблонизированы с помощью настраиваемого шаблона данных, который в конечном итоге определяет, как отображается элемент. Кроме того, элементы могут быть связаны с наблюдаемой коллекцией, поэтому она будет автоматически обновляться.

Ни одна из этих функций не поддерживается Panel. Можно использовать шаблоны данных, но вам нужно вручную создать связанный ContentControl / ContentPresenter и добавить его на панель.

В конечном счете, их функции различны. Панель используется для отображения UIElements / Visuals. ItemsControl используется для отображения любого типа данных и применения шаблонов по мере необходимости.

...