Ответ 1
Canvas в основном предназначен для пользовательской функции рисования больше всего. Сетка, безусловно, лучший выбор для настройки вашего макета.
Я ищу мнение об использовании панелей Canvas vs. Grid в WPF. Мне нужно создавать классические формы ввода, которые имеют в основном схемы сетки, у некоторых могут быть небольшие datagrids внутри, groupboxes, но все выровнены в макете сетки. Я пытаюсь использовать панель Grid или Canvas для всех моих форм. Сетка дает мне хорошую структуру; Я могу поддерживать выравнивание элементов управления более легко. У меня будет базовый класс (который наследует класс Window) для всех окон, поэтому дизайнер в Visual Studio будет бесполезен, так как он имеет проблемы для такого рода наследования, а с панелью Grid мне даже не нужен дизайнер, и я могу установить окно SizeToContent, поэтому все будет в порядке. Но опять же с Canvas, у меня есть возможность позиционировать элементы управления любым способом, который мне нравится, и это только преимущество, которое я вижу при использовании Canvas.
У меня не было такого большого опыта в WPF, чтобы предсказать, какие проблемы я могу получить от запросов клиентов по макету. В веб-формах я иногда использую абсолютное позиционирование для форм, на случай, если у клиента есть "специальный" запрос: иметь ли контрольный пиксель справа или слева выше и т.д. Все работают с требовательными клиентами, понимая, что я имею в виду.
Id нравится видеть, что вы думаете, какие плюсы и минусы для создания макета бизнес-формы? Почему один лучше другого? Любые случаи, когда одна панель будет плохо использовать, а другая нет? Каковы недостатки одной панели для другой? Какую панель вы бы использовали?
Спасибо
Canvas в основном предназначен для пользовательской функции рисования больше всего. Сетка, безусловно, лучший выбор для настройки вашего макета.
Вы можете получить подробную информацию о фактической компоновке сетки, ширине столбца/строки, ширине, высоте и т.д.
На мой взгляд, было бы легче сделать макет различных элементов на сетке, контролируя размер строки и столбца, чем делать все жестко закодированное в холст. Это также облегчит работу, если они решат изменить разрешения позже по дороге.
От Адама Натана 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 делает это быстро.
Определенно, сетки кажутся вам необходимыми для ваших требований.
Я бы сравнял Grids с таблицами в html (очень полезно при правильном использовании), в то время как Canvas больше похож на div. Разница в том, что сетки - это то, что таблицы должны быть в HTML, а также с div vs Canvas.
В разделе сеток найдите время, чтобы определить свои RowDefinitions и ColumnDefinitions, вместо того, чтобы помещать маркер в свои элементы управления, чтобы правильно позиционировать. Вы пожалеете об этом, если вы этого не сделаете.
Даже если вы не можете использовать VS Designer, вы все равно можете использовать визуальный конструктор XAML для создания/редактирования содержимого сетки.
Одним из основных преимуществ UX для WPF/SL/XAML является возможность компоновки "жидкого" типа HTML. Несмотря на то, что вам может не понадобиться это с вашим текущим дизайном, это явно будущее и стоит изучить, как утонченность.
Отметьте Rob Relyea отличный список доступных редакторов XAML
Я бы пошел с 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(); }