J T*_*ana 46 wpf xaml declarative mvvm
在建筑方面,我认为WPF非常棒.一般来说,我是底层渲染/动画内部工作的忠实粉丝.模板和造型设置的灵活性令人印象深刻.
但是我讨厌XAML - 我觉得它让很多事情变得复杂.我已经在大型和小型应用程序中使用它,我发现自己多次试图弄清楚如何在XAML中做一些基本原理是基本但语法古怪的东西.不仅如此,我多次想知道解析/绑定的某些部分有多重.(我知道它已编译,但我不确定在运行时仍有多少评估)
XAML只是构建和加载可视化树的一种方式.是否有任何框架可以简化以非XML,基于代码(但仍然主要是声明性)的方式构建可视树?具体来说,我对在保留MVVM方法的同时缓解以下任何问题的框架感兴趣:
强类型绑定.指定ViewModel必须符合特定类型.我假设BaseBinding在引擎盖下使用反射,我对它的速度有点怀疑,更不用说破坏的绑定令人讨厌.
结合更快,不INotifyPropertyChanged具有约束力.似乎BindableProperty<T>可以创建某种类型,绑定可以直接监听,而不是接收所有ViewModel属性更改.使用直接回调与字符串参数似乎也是有利的.
一种不同的资源管理方法; 再次,强类型字典可能是相当不错的.我几乎希望将样式视为lambdas或者某种东西来捕捉强烈类型的方面.
总之,任何基于非XAML的框架都适合MVVM,并且是强类型的?
Olm*_*lmo 28
我支持Xaml-free WPF.我喜欢WPF的布局和绑定功能,但我也讨厌XAML.我希望WPF可以用简单的C#编写,有一些优点:
<Setter>语法.我认为WPF增加了太多的复杂性以允许它被设计.从FrontPage到Razor的旧时代,Web开发已经失去了这场战斗.
简化?不可以。但是您可以在 XAML 中执行的所有操作都可以在代码中执行。例如,这是一个简单的 Windows Ink 绘图应用程序 - 非常简单:
无需保存,无需更改任何内容 - 但您可以通过代码。
画板.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();
}
}
Run Code Online (Sandbox Code Playgroud)
画板.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>
Run Code Online (Sandbox Code Playgroud)
这就是全部。当然,如果你想避免 XAML,那基本上意味着你将不得不编写一堆备用的 .NET 代码,所以这取决于你 - 你想在 XAML 中转储那些东西,或者你愿意吗?而是写在代码中?
我认为在 VS 中执行此操作的最大好处是您可以获得良好的设计师支持,因此通常很容易直观地看到所有内容和去向。它也可能较少查找文档,有时不得不进行一些飞跃。
但是没有 XAML 的 WPF是可能的。
您甚至不需要为此安装 Visual Studio,只需安装 .NET CLI 和开发人员命令提示符即可。将这两个文件放到一个文件夹中运行msbuild,然后就可以运行Bin目录中的文件了。
这个问题肯定需要Bling UI Toolkit的链接。它是一个超天才的高级库,用于在WPF之上提供动画和丰富的UI原型。与button.Width = 100 - slider.Value动画绑定,例如:button.Left.Animate().Duration(500).To = label.Right像素着色器编译器-很棒。
可悲的是,我认为该项目不再进行。但是,许多非常聪明的想法可以为我们提供一些思考。
WPF 没有这样的框架。您在愿望清单中提到的三件事将是 WPF 已提供的组件的直接(且不同)替代品。此外,用您的版本替换绑定和资源系统将使您喜欢的 WPF 功能(动画、模板等)无法使用,因为它们严重依赖于绑定、资源等。
以下是一些可能会改善您的体验的建议。
1. 学习处理 XAML(我以前也讨厌它,但现在我已经习惯了,它太棒了)
2. 构建您自己的库,使您可以轻松地用代码创建 UI。毕竟,在 XAML 中完成的所有操作也可以在代码中完成。
3. 如果您真的讨厌 INotifyPropertyChanged,并且想要回调,请使用 DependencyProperty。没有事件可供您引发,并且您可以拥有回调和默认值!
4.) 不要使用WPF。尽管您说您喜欢该架构,但您列出的缺点/所需的“改进”几乎涵盖了所有内容。