WPF без XAML
архитектурно я думаю, что WPF довольно потрясающий. В общем, я большой поклонник внутренней работы рендеринга/анимации. Гибкость настройки шаблонов и стилей довольно впечатляет.
но я ненавижу XAML-я чувствую, что это усложняет многие вещи. Я использовал его в больших и малых приложениях, и я много раз пытался понять, как сделать что-то в XAML, для которого основной принцип является основным, но синтаксис причудлив. Не только это, но я много раз задавался вопросом, насколько тяжелы некоторые части разбора/привязки. (Я знаю, что он скомпилирован, но я не уверен, сколько все еще оценивается во время выполнения)
XAML - это всего лишь один из способов построения и загрузки визуального дерева. Существуют ли какие-либо рамки для упрощения построения визуального дерева не XML-кодом (но все же в основном декларативным) способом? В частности, меня интересуют рамки, которые смягчают любые из следующих проблем при сохранении MVVM подход:
строго обязательными. Укажите, что ViewModel должен соответствовать определенному типу. Я предполагаю, что BaseBinding использует отражение под капотом, и я немного скептически отношусь к скорости этого, не говоря уже о том, что сломанные привязки раздражают.
более быстрая привязка, не -
INotifyPropertyChanged
привязка. Кажется, что-то вродеBindableProperty<T>
может быть создан, и привязка может прослушивать непосредственно это, а не получать все свойства ViewModel изменения. И использование прямого обратного вызова по сравнению со строковым аргументом также кажется выгодным.другой подход к управлению ресурсами; опять же, какие-то строго типизированные словари могут быть довольно приятными. Я почти хотел бы видеть стили как лямбды или что-то, чтобы захватить строго типизированный аспект.
В общем, любые фреймворки, которые не основаны на XAML, хорошо вписываются в MVVM и строго типизированы?
6 ответов
Desclaimer-я люблю xaml. Я думаю, что это лучшее, что может случиться с технологией UI с тех пор..что ж..я хотел сказать "winforms", но это действительно отстой - так с самого начала истории!
позвольте мне разбить ваши требования из этой новой и улучшенной структуры:
- строго типизированные привязки - хотя я согласен, что в некоторых настройках может быть полезно указать привязку строго типизированным способом, я часто использую тот факт, что привязка совершенно свободно быть очень полезным. обнаружение свойств во время выполнения является невероятно мощным свойством Xaml и механизма привязки. По моему опыту вы довольно быстро научитесь находить и исправлять проблемы привязки, а ошибки выполнения очень подробные. Может, это и не идеально , но все же неплохо.
- более быстрая привязка - производительность, это достаточно быстро для большинства ситуаций. Вы всегда можете предоставить ICustomTypeDescriptor для повышения производительности в крайние проявления. Что касается этого связываемого свойства с обратным вызовом - как насчет какого-то Свойства Зависимостей? (я допускаю, что синтаксис несколько отсутствует). Однако для большинства применений я нашел интерфейс INotifyPropertyChanged достаточным. Механизм привязки заботится только о том, что произошло изменение, и он очень хорошо работает в его текущей форме. Почему вас волнует, как фреймворк решает эту проблему-до тех пор, пока он работает хорошо?
- ресурс Словари - это еще одна проблема реализации, которая в основном влияет на структуру, и это внутренняя работа. Почему вас волнует, как они реализуются? Они неплохо работают.
Я подозреваю, что вы можете злоупотреблять 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-почти так же просто, как вы могли бы сделать это:
нет сохранения, ничего не меняется - но вы можете через код.
Блокнот.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
и затем вы можете запустить файл в папке .