WPF без XAML

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

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

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

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

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

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

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

6 ответов


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

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

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

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

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


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

  • инициализаторы объектов и коллекций может заменить экземпляры Xaml. (жаль, что XAML предпочитает сверху вниз, чем вверх).
  • привязка преобразователи может быть просто лямбда.
  • стили может быть просто лямбда, которые изменяют объект после создания экземпляра, не раздутый <Setter> синтаксис.
  • DataTemplates будет просто lambdas, которые создают элементы управления с учетом объекта
  • DataTemplateSelectors будет просто DataTemplate лямбда, которая вызывает другие DataTemplates.
  • ItemsControl будет просто Foreach, который принимает лямбда (DataTemplate) и вызывает его снова, если новый элемент добавляется в базовую коллекцию.
  • x: имена будут просто имена переменных.
  • отсутствие потребности Для много MarkupExtensions
    • x:Static
    • x: тип (особенно со сложными дженериками тоже!)
  • элементы управления UserControl были бы просто функциями.

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


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

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


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

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


> non-INotifyPropertyChanged binding.

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

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

  • обновить элементы управления .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
    • поддерживает режим профиля клиента

упрощение? Нет. Но все, что вы можете сделать в XAML, вы можете просто сделать в коде. Например, вот простое приложение для рисования чернил Windows-почти так же просто, как вы могли бы сделать это:

who needs visual studio? green ink on purple background

нет сохранения, ничего не меняется - но вы можете через код.

Блокнот.cs

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Ink;

public class Sketchpad : Application {

    [STAThread]
    public static void Main(){
        var app = new Sketchpad();
        Window root = new Window();
        InkCanvas inkCanvas1 = new InkCanvas();

        root.Title = "Skortchpard";

        root.ResizeMode = ResizeMode.CanResizeWithGrip;
        inkCanvas1.Background = Brushes.DarkSlateBlue;
        inkCanvas1.DefaultDrawingAttributes.Color = Colors.SpringGreen;
        inkCanvas1.DefaultDrawingAttributes.Height = 10;
        inkCanvas1.DefaultDrawingAttributes.Width = 10;

        root.Content = inkCanvas1;
        root.Show();
        app.MainWindow = root;
        app.Run();
    }

}

Блокнот.csproj файл

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="15.0">
  <PropertyGroup>
    <AssemblyName>Simply Sketch</AssemblyName>
    <OutputPath>Bin\</OutputPath>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xaml">
      <RequiredTargetFramework>4.0</RequiredTargetFramework>
    </Reference>
    <Reference Include="WindowsBase" />
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="SketchPad.cs" />
  </ItemGroup>
  <Target Name="Build" Inputs="@(Compile)" Outputs="$(OutputPath)$(AssemblyName).exe">
    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
    <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
  </Target>
    <Target Name="Clean">
    <Delete Files="$(OutputPath)$(AssemblyName).exe" />
  </Target>
  <Target Name="Rebuild" DependsOnTargets="Clean;Build" />
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

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

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

но WPF без XAML можно.

для этого даже не требуется Visual Studio, только CLI .NET и Командная строка разработчика. Удалить эти два файла в папку и запустите msbuild и затем вы можете запустить файл в папке .