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

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

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

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

Спасибо

5 ответов

Решение

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

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

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

Из развязанного Адамом Натаном WPF (стр. 168):

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

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

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

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

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

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

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

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

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

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

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

Так как я предварительно датирую дженерики, мы можем вернуться к предыдущим методологиям. Одним из них является вспомогательный класс. Каждый вид реализует 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(); }
Другие вопросы по тегам