没有XAML的WPF

J T*_*ana 46 wpf xaml declarative mvvm

在建筑方面,我认为WPF非常棒.一般来说,我是底层渲染/动画内部工作的忠实粉丝.模板和造型设置的灵活性令人印象深刻.

但是我讨厌XAML - 我觉得它让很多事情变得复杂.我已经在大型和小型应用程序中使用它,我发现自己多次试图弄清楚如何在XAML中做一些基本原理是基本但语法古怪的东西.不仅如此,我多次想知道解析/绑定的某些部分有多重.(我知道它已编译,但我不确定在运行时仍有多少评估)

XAML只是构建和加载可视化树的一种方式.是否有任何框架可以简化以非XML,基于代码(但仍然主要是声明性)的方式构建可视树?具体来说,我对在保留MVVM方法的同时缓解以下任何问题的框架感兴趣:

  1. 强类型绑定.指定ViewModel必须符合特定类型.我假设BaseBinding在引擎盖下使用反射,我对它的速度有点怀疑,更不用说破坏的绑定令人讨厌.

  2. 结合更快,不INotifyPropertyChanged具有约束力.似乎BindableProperty<T>可以创建某种类型,绑定可以直接监听,而不是接收所有ViewModel属性更改.使用直接回调与字符串参数似乎也是有利的.

  3. 一种不同的资源管理方法; 再次,强类型字典可能是相当不错的.我几乎希望将样式视为lambdas或者某种东西来捕捉强烈类型的方面.

总之,任何基于非XAML的框架都适合MVVM,并且是强类型的?

Olm*_*lmo 28

我支持Xaml-free WPF.我喜欢WPF的布局和绑定功能,但我也讨厌XAML.我希望WPF可以用简单的C#编写,有一些优点:

  • Object和Collection初始值设定项可以替换Xaml实例化.(遗憾的是xaml喜欢自上而下而不是按钮).
  • 绑定转换器可能只是lambdas.
  • 样式可能只是在实例化后修改对象的lambda,没有臃肿的<Setter>语法.
  • DataTemplates只是lambdas,它在给定对象的情况下创建控件
  • DataTemplateSelectors只是一个调用其他DataTemplates的DataTemplate lambda.
  • ItemsControl只是一个带有lambda(DataTemplate)的Foreach,如果将新项添加到底层集合中,则再次调用它.
  • x:名称只是变量名.
  • 不需要很多MarkupExtensions
    • X:静
    • x:类型(特别是复杂的泛型!)
  • UserControls只是函数.

我认为WPF增加了太多的复杂性以允许它被设计.从FrontPage到Razor的旧时代,Web开发已经失去了这场战斗.

  • 你和我在这方面的想法非常相似.我想你可能会发现我为这些想法制作的小游乐场很有趣(但可能不太有用).我玩弄Fleck用于websockets并在Canvas中做一些简单的渲染.在https://bitbucket.org/jtrana/crimson/找到它.我得到了一个基本框架,简单的绑定,一个或两个基本控件,以及一个文本框上的小工作.一切都很天真的实现,但尝试基于lambda的绑定等很有趣.只需启动项目并在Crimson/Communication中打开client.html. (4认同)

Way*_*ner 8

简化?不可以。但是您可以在 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目录中的文件了。


Gov*_*ert 6

这个问题肯定需要Bling UI Toolkit的链接。它是一个超天才的高级库,用于在WPF之上提供动画和丰富的UI原型。与button.Width = 100 - slider.Value动画绑定,例如:button.Left.Animate().Duration(500).To = label.Right像素着色器编译器-很棒。

可悲的是,我认为该项目不再进行。但是,许多非常聪明的想法可以为我们提供一些思考。


A.R*_*.R. 3

WPF 没有这样的框架。您在愿望清单中提到的三件事将是 WPF 已提供的组件的直接(且不同)替代品。此外,用您的版本替换绑定和资源系统将使您喜欢的 WPF 功能(动画、模板等)无法使用,因为它们严重依赖于绑定、资源等。

以下是一些可能会改善您的体验的建议。
1. 学习处理 XAML(我以前也讨厌它,但现在我已经习惯了,它太棒了)
2. 构建您自己的库,使您可以轻松地用代码创建 UI。毕竟,在 XAML 中完成的所有操作也可以在代码中完成。
3. 如果您真的讨厌 INotifyPropertyChanged,并且想要回调,请使用 DependencyProperty。没有事件可供您引发,并且您可以拥有回调和默认值!
4.) 不要使用WPF。尽管您说您喜欢该架构,但您列出的缺点/所需的“改进”几乎涵盖了所有内容。