WPF без XAML

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

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

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

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

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

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

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


person J Trana    schedule 20.04.2011    source источник
comment
Проведите выходные с JavaFX и не оглядывайтесь назад.   -  person sproketboy    schedule 23.01.2017


Ответы (5)


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

  • Инициализаторы объектов и коллекций могут заменить экземпляры Xaml. (жаль, что xaml предпочитает сверху вниз, чем кнопку вверх).
  • Конвертеры привязки могут быть просто лямбдами.
  • Стили могут быть просто лямбда-выражениями, которые изменяют объект после создания экземпляра, без раздутого <Setter> синтаксиса.
  • Шаблоны данных будут просто лямбда-выражениями, которые создают элементы управления с учетом объекта.
  • DataTemplateSelectors будет просто лямбда-выражением DataTemplate, вызывающим другие DataTemplate.
  • ItemsControl - это просто Foreach, который принимает лямбда (DataTemplate) и вызывает его снова, если в базовую коллекцию добавляется новый элемент.
  • x: Names - это просто имена переменных.
  • No need for many MarkupExtensions
    • x:Static
    • x: Type (особенно со сложными обобщениями!)
  • UserControls будет просто функциями.

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

person Olmo    schedule 25.01.2012
comment
Мы с вами думаем об этом очень похоже. Я подумал, что небольшая игровая площадка, которую я сделал для некоторых из этих идей, может показаться вам интересной (но, вероятно, не слишком полезной). Я поигрался с использованием Fleck для веб-сокетов и выполнил простой рендеринг в Canvas. Найдите его на странице bitbucket.org/jtrana/crimson. Я дошел до базовой структуры с простыми привязками, одним или двумя базовыми элементами управления и небольшой работой над текстовым полем. Довольно наивная реализация всего, но весело попробовать привязки на основе лямбда и т. Д. Просто запустите проект и откройте client.html в Crimson / Communication. - person J Trana; 20.05.2012
comment
Я согласен со всем, что вы здесь говорите (по крайней мере, со всем, что я понимаю как инженер, не работающий с Windows), но, к сожалению, это тоже не дает ответа на вопрос. - person Michael Scheper; 21.06.2019
comment
Я согласен, основная цель разработки XML заключалась не в удобочитаемости и удобстве для разработчиков. - person BalintPogatsa; 16.07.2019

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

Кому нужна Visual Studio? зеленые чернила на фиолетовом фоне

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

Sketchpad.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();
    }

}

Sketchpad.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, только .NET CLI и командную строку разработчика. Перетащите эти два файла в папку и запустите msbuild, а затем вы можете запустить файл в каталоге Bin.

person Wayne Werner    schedule 21.09.2018

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

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

person Govert    schedule 26.05.2012

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

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

person A.R.    schedule 20.04.2011

> non-INotifyPropertyChanged binding.

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

  • DynamicViewModel: MVVM с использованием POCO с .NET 4.0: этот проект призван предоставить способ для реализации архитектурного паттерна Model View ViewModel (MVVM) с использованием простых старых объектов CLR (POCO), в то же время используя все преимущества .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 в свойства.

    • No attributes required
    • Ссылки не требуются
    • Базовый класс не требуется
    • Поддерживает .net 3.5, .net 4, Silverlight 3, Silverlight 4 и Windows Phone 7
    • Поддерживает режим профиля клиента
person k3b    schedule 20.04.2011
comment
Классные проекты - но все они реализуют INotifyPropertyChanged под капотом в той или иной форме или форме. Я ищу что-то более близкое к слушателю на свойство, а не к слушателю на объект. Спасибо! - person J Trana; 20.04.2011