[Metro Style Apps] XAML在Metro Style Apps中的改变

以C#开发Metro Style Apps的朋友们应该对XAML有一定程度的认识(除非是纯手工Code-Behind流),如果是曾经接触过WPF或是Silverlight的朋友们应该就对XAML更熟悉了。
撇开控件不说,在WPF里的XAML和Silverlight的XAML语法与它本身和.Net Framework之间的通透性就存在着不小的差异,而到了Metro Style Apps呢? 那差异可就更大了。


以C#开发Metro Style Apps的朋友们应该对XAML有一定程度的认识(除非是纯手工Code-Behind流),如果是曾经接触过WPF或是Silverlight的朋友们应该就对XAML更熟悉了。

撇开控件不说,在WPF里的XAML和Silverlight的XAML语法与它本身和.Net Framework之间的通透性就存在着不小的差异,而到了Metro Style Apps呢? 那差异可就更大了。

微软的传教士Jerry Nixon就在他的博客中撰写了 8 quirks Windows 8 XAML developers should understand before starting their Metro app 一文,点出XAML在Metro Style Apps中和WPF与Silverlight的不同。

身为曾经见证过Silverlight还只是JavaScript时(从WPF/e到后来的Silverlight 1.0版时期,Silverlight只有很基本的控件加上JavaScript可以玩)的开发者之一的我,觉得文章里有一句话说得很好:“还记得Silverlight只是JavaScript的时候吗?事物总是会进化的!而这个时候,它还是它。别再浪费时间在无穷抱怨的循环里了。就拿出你现有的动手做吧!!”(原文为:"Remember when Silverlight was only JavaScript? Things enhance! Meanwhile it is what it is. Don't waste cycles complaining. Build with what you have!")

言归正传,该文提到的改变如下:

  1. 默认的数据系结(Data Binding)模式不再为双向(TwoWay)了。在Metro Style Apps的XAML里,默认的数据系结模式为OneWay,即便是TextBox控件也亦如是。如果要将数据系结模式设定为双向系结,请乖乖的自己动手打。否则你可能会以为这么简单的数据系结都坏掉了,但它其实运行得好好的。
  2. ImageBrushTileMode 属性被移除了,因为 TileBrush 这个类也被移除了。 另外, RadialGradientBrush 类和 VisualBrush 类也都消失不见了。你可以花上好几个小时去爬Library的内容来确定这个事实(Jerry Nixon说他真的这样干了惊讶....)。不过,结论就是你得比你原先预期的使用更多的图片来完成你的设计。 
  3. PriorityBindingMultiBinding 的功能在Metro Style Apps中也被拔掉了(其实在Silverlight就被拔掉了). 同时,StringFormatTargetNullValue也被拔掉了,所以,我们得借由更多的Converter来作到原先能作到的功能。或是利用MVVM 设计模式来实践出格式转换的功能。
  4. 因为在尝试触发其他事件时可能产生的错误很容易被搞混,所以,就像Silverlight一样,Loaded 事件是唯一一个 EventTriggers 有支持到的 RoutedEvent。结论就是,大多数的动画将透过 VisualStates 来控制,而不再只是针对模式设计动画。
  5. 当在Release Candidate版中尝试着去把任何东西系结到某个控件的DataqContext时,编辑器会丢出一个WindowsUIXamlBindingWrapper 错误。这个只是设计阶段的问题,你可还是可以继续开发,不过会看到许多蓝色的底线少来了!
  6. 你没办法透过将DataGrid中的ItemTemplate里的任何值或者DataContext与DataGridViewItem 的 ColumnSpanRowSpan 这两个属性进行数据系结以控制 VariableSizedWrapGrid 的呈现。替代方案是,你必需继承GridView,并且覆写PrepareContainerForItemOverride()方法。(Jerry Nixon说这个方法很复杂,他之后会尽快撰文写说这个部分)
  7. 当要针对不支持硬件加速的属性设定动画时,你必需设定动画中的 EnableDependentAnimation 属性来允许动画被执行/拨放,并且必需作好动画会占用CPU性能的心理准备。否则,你的动画将会被忽略(不会抛出错误)。
  8. 在方法的参数中新增了一个名为 CallerMemberNameAttribute 的属性(你甚至可能不知道参数有它们自己的属性) 以用来查出被叫用的方法或是属性的名称。而这个新特性在实践 INotifyPropertyChanged 时是相当方便的一个东西。

加速!!长话短说的几项改变:

  1. 必需以 Popup 控件来实践 Flyout 功能。
  2. 当要实践 Flyout/Popup 时必需撰写 "placement" 逻辑。
  3. App.xaml 中的 RequestedTheme 属性无法针对每个单独页行进行设定。
  4. 如果要找Date Picker控件的话,请搜寻 Callisto
  5. 无法和Silverlight 5一样针对数据系结进行调试。

Jerry Nixon的这篇文章应该可以大幅的减少转移到Metro Style Apps时在XAML方面可能遭遇到的开发门槛,尤其是针对开发过WPF和Silverlight的朋友们(当然,也包括我在内),所以特别和大家分享!~