Сетка против холста

Я ищу мнение об использовании панелей Canvas vs. Grid в WPF. Мне нужно создавать классические формы ввода, которые имеют в основном схемы сетки, у некоторых могут быть небольшие datagrids внутри, groupboxes, но все выровнены в макете сетки. Я пытаюсь использовать панель Grid или Canvas для всех моих форм. Сетка дает мне хорошую структуру; Я могу поддерживать выравнивание элементов управления более легко. У меня будет базовый класс (который наследует класс Window) для всех окон, поэтому дизайнер в Visual Studio будет бесполезен, так как он имеет проблемы для такого рода наследования, а с панелью Grid мне даже не нужен дизайнер, и я могу установить окно SizeToContent, поэтому все будет в порядке. Но опять же с Canvas, у меня есть возможность позиционировать элементы управления любым способом, который мне нравится, и это только преимущество, которое я вижу при использовании Canvas.

У меня не было такого большого опыта в WPF, чтобы предсказать, какие проблемы я могу получить от запросов клиентов по макету. В веб-формах я иногда использую абсолютное позиционирование для форм, на случай, если у клиента есть "специальный" запрос: иметь ли контрольный пиксель справа или слева выше и т.д. Все работают с требовательными клиентами, понимая, что я имею в виду.

Id нравится видеть, что вы думаете, какие плюсы и минусы для создания макета бизнес-формы? Почему один лучше другого? Любые случаи, когда одна панель будет плохо использовать, а другая нет? Каковы недостатки одной панели для другой? Какую панель вы бы использовали?

Спасибо

Ответ 1

Canvas в основном предназначен для пользовательской функции рисования больше всего. Сетка, безусловно, лучший выбор для настройки вашего макета.

Ответ 2

Вы можете получить подробную информацию о фактической компоновке сетки, ширине столбца/строки, ширине, высоте и т.д.

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

От Адама Натана WPF Unleashed (стр. 168):

Подражание холсту с сеткойЕсли вы оставите Grid с одной строкой и столбцом и установите HorizontalAlignment и Вертикальное выравнивание всех детей к значениям, отличным от Stretch, дети добавляются к единственная ячейка, как Холст. Установка горизонтального выравнивания влево и влево VerticalAlignment to Top - это настройка Canvas.Left и Canvas.Top to 0. Настройка HorizontalAlignment to Right и VerticalAlignment to Bottom - это как настройка Canvas.Right и Canvas.Bottom to 0. Кроме того, применяя значения маржи к каждому элемент может дать вам тот же эффект, что и придание свойства Canvass к тому же значения.

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

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

Я лично сам использую решетки. Это может быть немного больше, чтобы выложить вещи на уровень пикселей, но в течение 5% времени, которое необходимо, это стоит того, чтобы абстрагироваться от множества проблем. Также хорошо, когда есть необходимость изменять размер строк и столбцов "на лету", GridSplitter делает это быстро.

Ответ 3

Определенно, сетки кажутся вам необходимыми для ваших требований.

Я бы сравнял Grids с таблицами в html (очень полезно при правильном использовании), в то время как Canvas больше похож на div. Разница в том, что сетки - это то, что таблицы должны быть в HTML, а также с div vs Canvas.

В разделе сеток найдите время, чтобы определить свои RowDefinitions и ColumnDefinitions, вместо того, чтобы помещать маркер в свои элементы управления, чтобы правильно позиционировать. Вы пожалеете об этом, если вы этого не сделаете.

Ответ 4

Даже если вы не можете использовать VS Designer, вы все равно можете использовать визуальный конструктор XAML для создания/редактирования содержимого сетки.

Одним из основных преимуществ UX для WPF/SL/XAML является возможность компоновки "жидкого" типа HTML. Несмотря на то, что вам может не понадобиться это с вашим текущим дизайном, это явно будущее и стоит изучить, как утонченность.

Отметьте Rob Relyea отличный список доступных редакторов XAML

Ответ 5

Я бы пошел с Grid или специализированным подклассом Grid. Вы правы в отношении наследования. Дизайнер Visual Studio в UWP, WPF генерирует код поддержки для базового и подкласса с теми же именами методов. Он не компилируется.

Так как я предопределяю дженерики, мы можем вернуться к предыдущим методологиям. Один из них - вспомогательный класс. Каждый View реализует IBaseView и имеет свойство ViewHelper или ViewHelper<T>. enum ViewHelperOptions вполне может понадобиться. При необходимости каждый из ViewHelpers может использовать наследование без нарушения работы Visual Designer. Это позволяет использовать общий код, а также определенный код представления, не нарушая модель MVVM. Позвольте называть его MVHVM, поскольку ViewHelper имеет знания о ViewHelper. Это дополнительно отделяет V от VM.

Для полной реализации может потребоваться использование Activator.CreateInstance. Другое соображение - конструкторы, которые вызывается дизайнером. Вы должны переместить весь код "will-crash-if-not-running" в инициализацию, порожденную (скажем) событием Loaded. В качестве альтернативы вы можете использовать (UWP):

if (!Windows.ApplicationModel.DesignMode.DesignModeEnabled)
{ DoStuffWhichShouldOnlyBeDoneAtRunTime(); }