WPF和Silverlight区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF和Silverlight区别相关的知识,希望对你有一定的参考价值。

WPF和Silverlight区别 他们有什么关系 现在的版本个是多少,VS2008和2010

【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则依赖浏览器实现。
参考技术A WPF和Silverlight其实是一样的,都是建立于XAML之上,只要学好了.Net的基础框架,上层的东西都是基本相同的。 参考技术B Silverlight原名WPF/E,就是WPF Everywhere,它是WPF的一个子集。它基于浏览器插件,服务器端不需要部署任何环境,客户端只需要安装Runtime浏览器插件,无须安装.net Framework 3.0。所以,SilverLight的运行环境不受操作系统和浏览器的种类限制。当然,不仅如此,Silverlight作为WPF一个轻量级版本,还是削减了一些其他功能的。 WPF就不用说了,Web程序和桌面应用程序都可以编写,但运行时必须安装.net Framework。 VS2008支持的最高版本是.NET Framework 3.5和Silverlight 3 VS2010目前支持的版本是.NET Framework 4和Silverlight 4本回答被提问者采纳

WPF/Silverlight:裁剪到网格单元大小和 RenderTransform

【中文标题】WPF/Silverlight:裁剪到网格单元大小和 RenderTransform【英文标题】:WPF/Silverlight: Clipping to Grid Cell Size & RenderTransform 【发布时间】:2011-07-25 15:21:53 【问题描述】:

我有一个这样定义的简单网格:

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="24" />
    <RowDefinition Height="*" />
  </Grid.RowDefinitions>

  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="24" />
    <ColumnDefinition Width="*" />
  </Grid.ColumnDefinitions>
</Grid>

在网格的每个单元格(左上角单元格除外)中,我添加了一个网格或画布。在这些容器中,我添加了几个不同的对象。由于放大或缩小和滚动,其中一些控件可以更改查看大小。

原代码不是我自己的,但是我做了一个小测试程序来模拟这种情况:

<Grid Grid.Column="1" Grid.Row="1">
  <Grid.RowDefinitions>
    <RowDefinition Height="*"/>
    <RowDefinition Height="20"/>
  </Grid.RowDefinitions>

<Grid x:Name="Frame" Grid.Row="0">
  <Canvas Width="200" Height="300" Background="Green" >
    <Canvas x:Name="Page" Width="200" Height="300" Background="Bisque" Margin="0 -20 0 0">
      <Canvas.RenderTransform>
        <ScaleTransform ScaleX="Binding ElementName=Zoom, Path=Value"
                        ScaleY="Binding ElementName=Zoom, Path=Value"
                        CenterX="100" CenterY="150" />
      </Canvas.RenderTransform>
    </Canvas>
  </Canvas>
</Grid>
<Slider x:Name="Zoom" Grid.Row="1" HorizontalAlignment="Right" Width="200"
        Minimum="0.1" Maximum="2" Value="1"
        TickPlacement="BottomRight" TickFrequency="0.1" IsSnapToTickEnabled="True" />

页面太大,超出范围,尤其是当我放大时。

我尝试添加剪辑,但我不知道如何动态设置值。

<Grid x:Name="Frame" Grid.Row="0">
  <Grid.Clip>
    <!-- I want to bind to the actual size of the cell -->
    <RectangleGeometry Rect="0 0 480 266" />
  </Grid.Clip>
  <Canvas Width="200" Height="300" Background="Green" >
  ....

此外,如何获得渲染画布的实际大小和位置。我插入 Zoom_ValueChanged 以读出缩放后的值,但 Width 和 Height 仍然是 200 或 300,ActualWidth 和 ActualHeight 都是零。

提前致谢。

【问题讨论】:

【参考方案1】:

Em1,确保在内容加载完成后(即引发 Loaded 事件后)检查画布的 ActualWidth 和 ActualHeight。

此外,考虑到所有已应用到它的缩放变换来获取画布大小的一种方法是向上走可视化树并将所有缩放变换应用到控件的 ActualWidth 和 ActualHeight:

public static Size GetActualSize(FrameworkElement control)

    Size startSize = new Size(control.ActualWidth, control.ActualHeight);

    // go up parent tree until reaching root
    var parent = LogicalTreeHelper.GetParent(control);
    while(parent != null && parent as FrameworkElement != null && parent.GetType() != typeof(Window))
    
        // try to find a scale transform
        FrameworkElement fp = parent as FrameworkElement;
        ScaleTransform scale = FindScaleTransform(fp.RenderTransform);
        if(scale != null)
        
            startSize.Width *= scale.ScaleX;
            startSize.Height *= scale.ScaleY;
        
        parent = LogicalTreeHelper.GetParent(parent);
    
    // return new size
    return startSize;


public static ScaleTransform FindScaleTransform(Transform hayStack)

    if(hayStack is ScaleTransform)
    
        return (ScaleTransform) hayStack;
    
    if(hayStack is TransformGroup)
    
        TransformGroup group = hayStack as TransformGroup;
        foreach (var child in group.Children)
        
            if(child is ScaleTransform)
            
                return (ScaleTransform) child;
            
        
    
    return null;

要获取控件的位置,您需要找到它相对于包含窗口的变换。方法如下:

    public static Point TransformToWindow(Visual control)
    
        var hwndSource = PresentationSource.FromVisual(control) as HwndSource;
        if (hwndSource == null)
            return new Point(-1, -1);
        Visual root = hwndSource.RootVisual; // Translate the point from the visual to the root.
        GeneralTransform transformToRoot = control.TransformToAncestor(root);
        return transformToRoot.Transform(new Point(0, 0));
    

【讨论】:

以上是关于WPF和Silverlight区别的主要内容,如果未能解决你的问题,请参考以下文章

WPF和Silverlight的关系

wpf和silverlight有啥不同

WPF/Silverlight:裁剪到网格单元大小和 RenderTransform

在 WPF、Silverlight 和 ASP.NET 之间共享一个公共 DAL

WPF DataGrid 样式-Silverlight DataGrid?

什么音频格式适用于 Silverlight + WPF?