Подтвердить что ты не робот

WPF без XAML

Архитектурно, я думаю, что WPF довольно изумительный. В общем, я большой поклонник внутренней обработки рендеринга/анимации. Гибкость настройки шаблонов и стилей довольно впечатляет.

Но я ненавижу XAML - я чувствую, что это усложняет многие вещи. Я использовал его в больших и малых приложениях, и я много раз пытался выяснить, как сделать что-то в XAML, для которого базовый принцип является базовым, но синтаксис является изворотливым. Не только это, но я много раз задавался вопросом, насколько тяжелы определенные части синтаксического анализа/привязки. (Я знаю, что он скомпилирован, но я не уверен, сколько еще оценивается во время выполнения)

XAML - это всего лишь один способ создания и загрузки визуального дерева. Существуют ли какие-либо рамки для упрощения построения визуального дерева в не-XML, основанный на кодах (но все же в значительной степени декларативный) способ? В частности, меня интересуют рамки, которые смягчают любые из следующих проблем, сохраняя при этом подход MVVM:

  • Сильно типизированная привязка. Укажите, что ViewModel должен соответствовать определенному типу. Я предполагаю, что BaseBinding использует отражение под капотом, и я немного скептически отношусь к скорости этого, не говоря уже о том, что разбитые привязки раздражают.

  • Ускоренное связывание, не связанное с INotifyPropertyChanged. Кажется, что какой-то тип BindableProperty<T> может быть создан, и привязка может прослушиваться напрямую, а не получать все изменения свойств ViewModel. И использование прямого обратного вызова в сравнении с строковым аргументом также показалось бы полезным.

  • Другой подход к управлению ресурсами; опять же, сильно типизированные словари могут быть довольно приятными. Я почти хотел бы видеть стили как лямбды или что-то, чтобы зафиксировать строго типизированный аспект.

Итак, любые фреймворки, не основанные на XAML, хорошо подходят для MVVM и строго типизированы?

4b9b3361

Ответ 1

Desclaimer - я LOVE xaml. Я думаю, что самое лучшее, что может случиться с технологией UI с тех пор... ну... я хотел сказать "winforms", но это действительно сосало - так с самого начала истории!

Позвольте мне раскрыть ваши требования из этой новой и улучшенной структуры:

  • Сильно привязанные привязки. Хотя я согласен, что может быть полезно в некоторых настройках для конкретной привязки строго типизированным способом, я часто нахожу себя в том, что привязка полностью свободна, чтобы быть очень полезной, обнаружение свойств среды выполнения - невероятно мощное свойство Xaml и механизма привязки. По моему опыту вы очень быстро научились находить и исправлять проблемы с привязкой, а ошибки времени выполнения очень детализированы. Это может быть не идеально, но это довольно хорошо.
  • Быстрая привязка - производительность, довольно быстро для большинства ситуаций. Вы всегда можете предоставить ICustomTypeDescriptor для повышения производительности в крайних случаях. Что касается свойства Bindable с обратным вызовом - как насчет какого-то Dependency Property? (я признаю, что синтаксис несколько не хватает). Однако для большинства применений я нашел интерфейс INotifyPropertyChanged достаточным. Механизм привязки заботится только о том, что произошли изменения, и он очень хорошо работает в текущей форме. Почему вам небезразлично, как структура решает эту проблему - пока она работает хорошо?
  • Словари ресурсов. Это еще одна проблема с реализацией, которая в основном влияет на структуру и внутреннюю работу. Почему вам все равно, как они реализованы? Они работают очень хорошо.

Я подозреваю, что вы можете злоупотреблять кодом для решения проблем, которые могут и должны быть решены в Xaml. Это предоставляет вам базовый способ решения этих различных проблем и с которыми я почти никогда не сталкивался в WPF. Четкое разделение, предоставляемое Xaml между "вещами, которые являются графическим интерфейсом" и "Вещи, которые являются вашим кодом", затрудняет вам вмешательство в пользовательский интерфейс с помощью кода. Но WPF предоставляет MANY другой механизм для решения этих решений элегантным способом с помощью Xaml.

Если вам не нравится кодирование (лично мне не нравится возиться с пользовательским интерфейсом - он никогда не заканчивается) - нанимайте Xaml Expert. Они, как правило, имеют лучший вкус в пользовательском интерфейсе, а затем разработчики. И если вы не можете - узнайте об этом! это отличный инструмент, если вы потратите время, чтобы понять это. Никакая структура не решит проблему его использования.

Ответ 2

Я поддерживаю вас в Xaml-free WPF. Мне нравятся возможности компоновки и привязки WPF, но я тоже ненавижу XAML. Мне бы очень хотелось, чтобы WPF мог быть написан на простом С#, некоторые преимущества:

  • Инициализаторы объектов и коллекций могут заменить экземпляры Xaml. (жаль, что xaml предпочитает сверху вниз, чем кнопка вверх).
  • Связывающие преобразователи могут быть только лямбдами.
  • Стили могут быть просто лямбдами, которые изменяют объект после создания экземпляра, без раздутого синтаксиса <Setter>.
  • DataTemplates - это просто lambdas, которые создают элементы управления с учетом объекта
  • DataTemplateSelectors будет просто лямбдой DataTemplate, которая вызывает другие DataTemplates.
  • ItemsControl Будет просто Foreach, который принимает lambda (DataTemplate) и вызывает его снова, если новый элемент будет добавлен в базовую коллекцию.
  • x: Имена будут просто именами переменных.
  • Не нужно много MarkupExtensions
    • х: Static
    • x: Тип (специально для сложных дженериков тоже!)
  • UserControls будут просто функциями.

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

Ответ 3

Этот вопрос определенно нуждается в ссылке на Инструмент для веб-интерфейса Bling. Это супер-гениальная библиотека высокого уровня для анимации и богатый прототип пользовательского интерфейса поверх WPF. Связывание с button.Width = 100 - slider.Value, анимация следующая: button.Left.Animate().Duration(500).To = label.Right, компилятор пиксельных шейдеров - потрясающий.

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

Ответ 4

Для WPF таких фреймворков нет. Три вещи, которые вы упомянули в своем списке пожеланий, будут прямыми (и разными) заменами для компонентов, уже предоставленных WPF. Кроме того, замена систем привязки и ресурсов вашими версиями сделает непригодными для использования WPF (анимацию, шаблоны и т.д.), Поскольку они в значительной степени зависят от привязки, ресурсов и т.д.

Вот несколько советов, которые могут улучшить ваш опыт.
1. Научитесь разбираться с XAML (я тоже ненавидел свои кишки, но теперь, когда я привык к этому, это замечательно)
2. Создайте свою собственную библиотеку, которая упрощает создание пользовательского интерфейса для вас, в коде. В конце концов, все, что сделано в XAML, можно сделать и в коде. 3. Если вы действительно ненавидите INotifyPropertyChanged и хотите, чтобы обратный вызов вместо этого использовал DependencyProperty. Нет событий для вас, и вы можете получить обратные вызовы и значения по умолчанию!
4.) Не используйте WPF. Даже если вы говорите, что вам нравится архитектура, ваш список недостатков/желаемых "улучшений" охватывает почти все.

Ответ 5

> non-INotifyPropertyChanged binding.

В вручную реализовать INotifyPropertyChanged в вашей модели viewmodell или modell довольно много ручной/речитативной работы. Однако я читал об этих альтернативах

  • DynamicViewModel: MVVM с использованием POCOs с .NET 4.0. Этот проект призван обеспечить способ реализовать архитектурный шаблон модели View ViewModel (MVVM) с использованием обычных объектов CLR (POCOs), в то же время в полной мере используя класс .NET 4.0 DynamicObject Class. Воспользовавшись .NET 4.0 и классом DynamicObject, мы можем создать тип, полученный из класса DynamicObject, и указать динамическое поведение во время выполнения. Кроме того, мы можем реализовать интерфейс INotifyPropertyChanged на производном типе, что делает его хорошим кандидатом для привязки данных.

  • Update Controls.NET: привязка данных WPF и Silverlight без INotifyPropertyChanged. Он автоматически обнаруживает зависимости, поэтому вам не нужно управлять ими в вашей модели просмотра. И это работает с Winforms. Свяжите код с помощью событий.

  • notifypropertyweaver: Использует прошивку IL (через http://www.mono-project.com/Cecil), чтобы ввести INotifyPropertyChanged код в свойства.

    • Не требуется никаких атрибутов
    • Не требуется никаких ссылок
    • Не требуется базовый класс
    • Поддерживает .net 3.5,.net 4, Silverlight 3, Silverlight 4 и Windows Phone 7.
    • Поддержка режима профиля клиента