北京动点飞扬软件

近七年行业项目解决方案、专注WPF外包、SaaS外包、GoLang外包、H5外包、微信小程序外包、UE4外包、U3D外包等 案例丰富 — 您最值得信赖的合作伙伴 — 可签公司合同
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

WPF与Silverlight区别

本文将讨论的是WPF与Silverlight的关键区别,希望本文能对大家更好的了解这两者有所帮助。
Silverlight刚诞生时,很多人只是简单的理解它为Flash的竞争对手。但是随着微软的进一步工作,Silverlight的应用范围越来越广泛,甚至很多人将它与WPF混为一谈。本文将为大家细细道来。

当WPF和Silverlight越来越受到.NET开发人员重视的时候,两者间的界限也越来越模糊。回顾六月,Wintellect发布了鲜为人知但极其重要的“微软WPF和Silverlight之异同白皮书”。我们建议GUI开发人员要通读全部69页,我们会列出主要的观点及其对相关业务范围开发人员的影响。

依赖关系属性是两个平台的重要组成部分,使用PropertyMetadata可代替普通字段来保存属性。Silverlight仅提供了该类,而WPF却有若干子类型可用。

UIPropertyMetadata添加了一个标识符,用于决定“在使用了元数据实例的地方,是否应该禁播依赖关系属性的动画”

FrameworkPropertyMetadata添加一个标识符来指示影响管道的那些属性,包括控制管理、测量和呈现。它也可用于指示属性是否允许数据绑定以及默认的类型。由于Silverlight不支持该类,因此所有的数据绑定在默认情况下都是单向的。

Silverlight不支持隧道事件。两个平台都支持Direct事件和Bubbling事件。

WPF支持多种类型的触发器。一个简单的触发器附加到依赖关系属性后,当触发器条件满足的时候便会自动修改样式。除了简单触发器以外,WPF也支持可响应路由事件或使用数据绑定的触发器。

Silverlight使用视觉状态管理器代替触发器。WPF当前并不提供该技术,但会在WPF 4.0中添加。

Silverlight仅支持若干标记扩展。除了通用的StaticResource、Binding和TemplateBinding扩展以外,WPF还添加了DynamicResource、RelativeSource、x:Type、x:Static和x:Array。

有很多键盘和鼠标事件仅在WPF中可用。由于为数众多的关系,我们稍后会列出完整列表。

关于UIElement类和IInputElement接口。当某个控件被禁用的时候,WPF使用它们来禁用所有的子控件。Silverlight不提供这种功能,所以开发人员不得不手动遍历控件树。

在通信方面,Silverlight仅限于BasicHttpBinding和PollingDuplexHttpBinding。当然,WPF支持所有的绑定。

最后,打印功能在两者之间也完全不同。WPF可直接打印可视化树而Silverlight则依赖浏览器实现。

 


  WPF(Windows Presentation Foundation,Windows外观基础(直译))是基于Framework 3.0(含以后版本)的新一代Windows界面开发技术。


  Silverlight(中文翻译为“银光”),可以看成是WPF的Web应用产品,其早先名为WPF/E。其主要应用于Web富客户端应用程序(RIA,Rich
Interface Application)。现阶段此技术可以说比较“火”,微软在此方面主要的对手就是Adobe公司的以Flash为基础的Flex技术。

  两者均是以XAML为基础的,在某些条件下是可以相互的转换:如定义一个简单的ARGB调色版应用:


WPF应用程序如下:


  • XAML文件:
<Window x:Class="WPFColorVersion.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WPF Color Version" Height="300" Width="400" WindowStartupLocation="CenterScreen" ResizeMode="NoResize">
<
Canvas Margin="0,0,0,0">
<
Canvas.Background>
<
LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<
GradientStop Color="#FF6254E2" Offset="0.996"/>
<
GradientStop Color="#FFFFFFFF" Offset="0"/>
</
LinearGradientBrush>
</
Canvas.Background>
<
TextBlock Height="34" Canvas.Left="28" Canvas.Top="17" Text="WPF Color Version" TextWrapping="Wrap" FontSize="24"
FontFamily="Comic Sans MS" FontWeight="Bold"/>
<
TextBlock Height="34" Canvas.Left="22" Canvas.Top="38" FontFamily="Comic Sans MS" FontSize="24" FontWeight="Bold"
Text="WPF Color Version" TextWrapping="Wrap" RenderTransformOrigin="0.5,0.5">
<
TextBlock.Foreground>
<
LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<
GradientStop Color="#FF000000" Offset="1"/>
<
GradientStop Color="#FFD9DFF0" Offset="0.026"/>
<
GradientStop Color="#FF7D818B" Offset="0.78"/>
</
LinearGradientBrush>
</
TextBlock.Foreground>
<
TextBlock.RenderTransform>
<
TransformGroup>
<
ScaleTransform ScaleX="1" ScaleY="-1"/>
<
SkewTransform AngleX="-29" AngleY="0"/>
<
RotateTransform Angle="0"/>
<
TranslateTransform X="0" Y="0"/>
</
TransformGroup>
</
TextBlock.RenderTransform>
</
TextBlock>
<
Rectangle Fill="#00000000" Width="156" Height="103" Canvas.Left="219" Canvas.Top="108" x:Name="demoArea" />
<
TextBlock Width="15" Height="17" Canvas.Top="116" Text="A" TextWrapping="Wrap" Canvas.Left="28" HorizontalAlignment="Center"/>
<
TextBlock Width="15" Height="17" Canvas.Left="28" Canvas.Top="142" Text="R" TextWrapping="Wrap" HorizontalAlignment="Center"/>
<
TextBlock Width="15" Height="17" Canvas.Left="28" Canvas.Top="166" Text="G" TextWrapping="Wrap" HorizontalAlignment="Center"/>
<
TextBlock Width="15" Height="17" Canvas.Left="28" Canvas.Top="194" Text="B" TextWrapping="Wrap" HorizontalAlignment="Center"/>
<
Slider Width="148" Height="22" Canvas.Left="43" Canvas.Top="111" Maximum="255" x:Name="sliderA" ValueChanged="sliderValueChanged"/>
<
Slider Width="148" Height="22" Canvas.Left="43" Canvas.Top="137" Maximum="255" x:Name="sliderR" ValueChanged="sliderValueChanged"/>
<
Slider Width="148" Height="22" Canvas.Left="43" Canvas.Top="163" Maximum="255" x:Name="sliderG" ValueChanged="sliderValueChanged"/>
<
Slider Width="148" Height="22" Canvas.Left="43" Canvas.Top="189" Maximum="255" x:Name="sliderB" ValueChanged="sliderValueChanged"/>
<
TextBlock Width="75" Height="17" Canvas.Left="143" Canvas.Top="230" Text="Color Value:"/>
<
TextBox Width="89" Height="20" Canvas.Left="219" Canvas.Top="227" Text="#00000000" x:Name="txtColorValue"/>
</
Canvas>
</
Window>


  • 代码文件:
using System.Windows;
using System.Windows.Media;

namespace WPFColorVersion
{
/// <summary>
///
Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private void sliderValueChanged(object sender, System.Windows.RoutedPropertyChangedEventArgs<double> e)
{
byte a = (byte)(sliderA.Value);
byte r = (byte)(sliderR.Value);
byte g = (byte)(sliderG.Value);
byte b = (byte)(sliderB.Value);

Color clr = Color.FromArgb(a, r, g, b);

demoArea.Fill = new SolidColorBrush(clr);
txtColorValue.Text = clr.ToString();
}
}
}

而对应在Silverlight中,XAML文件内:

<UserControl x:Class="SilverlightColorVersion.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<!--此位置与WPF项目的XAML文件内容完全相同-->
</UserControl>


另外,Silverlight的代码文件内容也与WPF项目中的代码相同。


 此可以看出,WPF与Silverlight有着千丝万缕的联系,我们在学习过程中可以相互的对比。