WPF没有XAML

在架构上,我认为WPF是相当惊人的。 一般来说,我是底层渲染/animation内部工作的忠实粉丝。 模板和样式的灵活性设置是相当令人印象深刻的。

但我讨厌XAML–我觉得这使许多事情变得复杂。 我已经用它在大型和小型应用程序,我发现自己多次试图找出如何在XAML中做的一些基本原则是基本的,但语法是古怪的。 不仅如此,我还多次想知道parsing/绑定的某些部分有多沉重。 (我知道它是编译的,但是我不确定在运行时仍然有多less评估)

XAML只是构build和加载可视化树的一种方式。 是否有任何框架可以简化以非XML,基于代码的方式构build可视化树? 具体而言,我对框架感兴趣,可以在保留MVVM方法的同时缓解以下任何问题:

  1. 强有力的绑定。 指定ViewModel必须符合特定的types。 我假设BaseBinding在底层使用了reflection,我对这个速度有些怀疑,更不用说破坏性的绑定令人讨厌了。

  2. 更快的绑定,非INotifyPropertyChanged绑定。 看起来像某种BindableProperty<T>可以被创build,绑定可以直接监听,而不是接收所有的ViewModel属性更改。 直接callback与string参数的使用似乎也是有利的。

  3. 一种不同的资源pipe理方法; 再次,强types的某种字典可能是相当不错的。 我几乎喜欢将样式看作lambda或什么来捕获强types的方面。

总而言之,任何非基于XAML的框架都适合MVVM,而且是强types的?

取消声明 – 我爱xaml。 我认为这是最好的事情发生在UI技术以来..好..我想说的“winforms”,但真的吸了 – 所以从历史的黎明!

让我从这个新的和改进的框架中分解出你的需求:

  1. 强types绑定 – 虽然我同意在某些设置中以强types的方式指定绑定可能是有用的,但是我经常发现自己使用绑定完全松散的事实是非常有用的。 属性的运行时发现是Xaml和绑定机制的一个令人难以置信的强大属性。 根据我的经验,您可以快速学会查找和修复绑定问题,而运行时错误非常详细。 这可能不是理想的 – 但它是相当不错的。
  2. 更快的绑定 – 性能 ,在大多数情况下是相当快的。 您可以随时提供ICustomTypeDescriptor以在极端情况下提高性能。 至于那个带callback的Bindable属性 – 怎么样的依赖属性呢? (我承认语法有些欠缺)。 但是,对于大多数用途,我发现INotifyPropertyChanged接口是足够的。 绑定机制只关心有一个变化的事实,它在当前的forms下工作得很好。 为什么你关心框架如何解决这个问题 – 只要它运行良好?
  3. 资源字典 – 这是另一个实施问题,主要影响框架,这是内部工作。 你为什么在乎他们是如何实施的? 他们工作得很好。

我怀疑你可能会过度使用代码隐藏来解决在Xaml中可以解决的问题。 这暴露了框架解决这些不同问题的方式,而且我几乎从来没有在WPF中处理过这些问题。 由Xaml提供的“作为GUI的东西”和“作为你的代码的东西”之间的明确分离使得使用代码难以干扰UI。 但是WPF通过使用Xaml提供了许多不同的机制来优雅地解决这些问题。

如果你不喜欢编码(个人我不喜欢弄乱用户界面 – 它永远不会结束) – 雇用一个Xaml专家。 无论如何,他们通常在UI中有更好的品味。 如果你不能 – 学习它! 如果你花时间去理解它,这是一个很好的工具。 没有任何框架可以解决它的使用问题。

我支持Xaml的免费WPF。 我喜欢WPF的布局和绑定function,但是我也讨厌XAML。 我很喜欢WPF可以写在纯C#中,一些优点:

  • 对象和集合初始化器可以取代Xaml实例化。 (可惜xaml比button更喜欢自上而下)。
  • 绑定转换器可能只是lambdaexpression式。
  • 样式可以只是在实例化之后修改对象的lambda,而不是臃肿的<Setter>语法。
  • DataTemplates只是创build给定对象的控件的lambdas
  • DataTemplateSelectors将只是一个调用其他DataTemplates的DataTemplate lambda。
  • ItemsControl只是一个采用lambda(DataTemplate)的Foreach,如果新项目添加到基础集合中,则会再次调用它。
  • x:名字只是variables名称。
  • 不需要许多MarkupExtensions
    • X:静
    • x:types(特别是复杂的generics)!
  • UserControls只是function。

我认为WPF增加了太多的复杂性,以便devise它。 从FrontPage到Razor的旧时代,Web开发已经失去了这场战斗。

这个问题肯定需要链接到Bling UI Toolkit 。 这是一个超级天才的高级animation库和丰富的WPF顶部的原型。 绑定与button.Width = 100 - slider.Value ,像这样的animation: button.Left.Animate().Duration(500).To = label.Right ,一个像素着色器编译器 – 惊人的。

可悲的是,我不认为这个项目正在进行中。 但很多非常聪明的想法给一些思考。

WPF没有这样的框架。 您在愿望清单中提到的三件事情将是对WPF已经提供的组件的直接(和不同的)替代。 另外,用你的版本replace绑定和资源系统会使你喜欢WPF(animation,模板等)的东西无法使用,因为它们严重依赖绑定,资源等。

以下是一些可能会改善您的体验的build议。
1.学习处理XAML(我曾经也讨厌它的胆量,但现在我已经习惯了它的伟大)
2.build立自己的库,使代码中的UI创build变得容易。 毕竟,所有在XAML中完成的工作都可以在代码中完成。
3.如果你真的讨厌INotifyPropertyChanged,而想要一个callback,而不是使用DependencyProperty。 没有事件可以提升,而且可以有callback和默认值!
4.)不要使用WPF。 即使你说你喜欢这个build筑,你的缺点/期望的“改进”也几乎涵盖了所有这些。

 > non-INotifyPropertyChanged binding. 

在viewmodell或modell中手动实现INotifyPropertyChanged是相当多的手动/复制工作。 不过,我读了关于这些替代品

  • DynamicViewModel:在.NET 4.0中使用POCO的MVVM :该项目旨在提供一种在充分利用.NET 4.0 DynamicObject类的同时,使用Plain Old CLR对象(PO​​CO)实现Model View ViewModel(MVVM)体系结构模式的方法。 利用.NET 4.0和DynamicObject类,我们可以创build一个从DynamicObject类派生的types,并在运行时指定dynamic行为。 此外,我们可以在派生types上实现INotifyPropertyChanged接口,使其成为数据绑定的理想select。

  • 更新控件.NET :没有INotifyPropertyChanged的WPF和Silverlight数据绑定。 它会自动发现依赖关系,因此您不必在View Model中进行pipe理。 它和Winforms一起工作。 使用事件绑定代码。

  • notifypropertyweaver :使用IL编织(通过http://www.mono-project.com/Cecil )将INotifyPropertyChanged代码注入到属性中。

    • 没有要求的属性
    • 不需要参考
    • 不需要基类
    • 支持.net 3.5,.net 4,Silverlight 3,Silverlight 4和Windows Phone 7
    • 支持客户端configuration文件模式