none
自测系列活动-问题4:Silverlight前台界面采用什么语言描述?Silverlight 2后台程序可以用什么语言来编写? RRS feed

  • 问题

  • 微软论坛2009全新奉献 全新打造技术自测系列活动
    主打第一波Silverlight技术自测  一起学习Silverlight

    亲爱的朋友,您好!

    微软Silverlight是一种最新的RIA技术,简单易学。中文技术论坛Silverlight版开版一年,为回馈更多用户,现开展通过技术自测、我问你答的活动,来帮助大家更深地了解Silverlight技术。为此,我们特地准备了《Silverlight2 导学》作为礼品,希望通过和微软论坛Silverlight版帮助你提高技术水平,结识更多技术朋友!

    活动形式:我们提出一系列开放式问题,请您给出您的答案即可。

    活动时间:3月5日—3月29日 (共计4周)

    活动礼品:《Silverlight2 导学》

    问题4:Silverlight前台界面采用什么语言描述?Silverlight 2后台程序可以用什么语言来编写?请具体描述各自特点,请举出至少一个完整的例子。

    期待您的参与!

    Facing problems, think first, then search, finally ask.
    2009年3月5日 10:54
    版主

答案

全部回复

  • Silverlight前台界面是使用XAML做为描述语言。
    1、XAML的概念和特点:
       XAML是eXtensible Application Markup Language的英文缩写,相应的中文名称为可扩展应用程序标记语言,它是微软公司为构建应用程序用户界面而创建的一种新的描述性语言。XAML提供了一种便于扩展和定位的语法来定义和程序逻辑分离的用户界面,而这种实现方式和ASP.NET中的"代码后置"模型非常类似。也就是说在开发一个应用程序时,我们可以将开发工作分成开发人员和设计人员两个团体分别进行,各自负责后台程序代码逻辑和前台程序界面的设计,这样就使得开发人员和设计人员之间的协作更通畅,也极大地发挥了他们的专长。

      提示:XAML的发音为"Zamel",笔者经常开玩笑地将其读成"折磨"。虽然XAML包含了许多新规则、元素和语法,但是我并不认为学习它是一个折磨人的过程。只要读者稍微具备一些HTML基础知识,就可以快速地掌握XAML中的大部分内容。

      提示:如今在WPF的官方网站上已经提供了一些很实用的工具,可以将其他格式的图形文件转换为XAML文件的形式。例如我们就可以将3DMax制作出的3D动画转换为XAML,这样WPF程序就可以直接通过转换好的XAML文件产生和3DMax制作出的3D动画相一致的效果。

      XAML简化了.Net Framework 3.0 编程模式上的用户界面创建过程,使用XAML开发人员可以对WPF程序的所有用户界面元素(例如文本、按钮、图像和列表框等)进行详细的定置,同时还可以对整个界面进行合理化的布局,这与使用HTML非常相似。但是由于XAML是基于XML的,所以它本身就是一个组织良好的XML文档,而且相对于HTML,它的语法更严谨、更明确。预计以后大部分的XAML都可由相应的软件自动生成,就如同我们现在制作一个静态页面时,几乎不用编写任何HTML代码就可以直接通过Dreamweaver软件生成一个美观的页面。但是最初通过手动编写XAML代码将是一次绝佳的学习体验,虽然实现的过程繁杂了些,但是将加深您对XAML语法和各个元素的理解。

      大多数的WPF程序可能同时包含程序代码和 XAML。我们可以使用XAML定义应用程序的初始界面,而后才编写相应的功能实现代码。我们可以将逻辑代码直接嵌入到一个XAML文件中,也可以将它保留在一个单独的文件中。实际上,能够用XAML实现的所有功能我们都可以使用程序代码来完成。因此,我们根本无需使用任何的XAML就可以创建一个完好的WPF程序。一般来说,程序代码的优势在于流程处理和逻辑判断,而不是界面的构建上。而XAML则是集中关注于界面的编程,我们可以将它和其它的.NET语言配合使用,从而构建出一个功能完善、界面美观的WPF程序。XAML是一种纯正的、用来描述用户界面构成元件和编排方式的标记语言。尽管有部分的XAML语法具备程序设计语言的特性(例如XAML中的Trigger和TRansform),但是XAML并不是一种用于程序设计的语言,它的功能也不是为了执行应用程序逻辑。

      XAML是一种解析性的语言,尽管它也可以被编译。微软推荐XAML被编译成BAML(Binary Application Markup Language-二进制语言程序标记语言)。XAML和BAML都可以被WPF解析,并且将以一种和HTML相似的方式进行界面的呈现。但是和HTML不同的是,XAML是强类型化的。也就是说,HTML会忽略那些它不能识别的元素和属性,而XAML必须在识别所有的元素和属性的情况下,才对页面进行呈现。尽管在XAML中各个属性都是以一个个的字符串(例如Background)表示的,但是这些字符串实际上代表的是WPF中的对象,只有被WPF识别的对象才可以作为元素的属性,所有我们说XAML是强类型化的。

      还有一点是我们反复强调的,XAML并不是HTML。尽管XAML在元素的声明、程序样式的设置和指定事件处理程序上都和HTML非常类似,但是XAML是基于XML的,它是WPF的外在表现形式。而HTML主是一种标记语言,仅仅是用来为浏览器呈现页面内容。XAML除了用来呈现信息和请求用户输入等基本的功能外,它还包含了一些高级的特性,例如它提供了对动画和3D众多方面的支持。

      XAML是可扩展的,正如它的名字指明的那样。开发人员可以创建自定义的控件、元素和函数来扩展XAML。而且由于XAML各元素在本质上就是WPF类的映射,所以开发人员可以很轻松地使用面向对象的技术对XAML元素进行扩展。也就是说我们可以开发一些自定义控件和组合元素,并将它公开给用户界面设计人员和其它的开发人员使用。
    2、XAML for Silverlight:
    Silverlight中的XAML和WPF不同,Silverlight中的XAML是从WPF完整的XAML中精简出来的,适用于WEB上的XAML语言,例如WPF中的Window在Silverlight中就没有实际意义。
    3、Silverlight后台语言:
    在x:Class关联的xxx.xaml.cs后台代码中可以使用C#、VB.NET、Ironruby、IronPython等.NET语系来开发,使用这些后台语言可以用来控制XAML界面中的实例,这些通过x:Name或Name来标记唯一性,类似ASP.NET Server控件的ID,所以一个XAML中不允许有重复的x:Name属性值,在Silverlight 2.0中还支持Linq和Linq to XML。
    4、完整例子:
    XAML:

    <UserControl x:Class="Sample.Sharp0" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
        Width="640" Height="300">  
        <Canvas x:Name="parentCanvas" Background="White"></Canvas> 
    </UserControl> 
     

    C#:

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Net;  
    using System.Windows;  
    using System.Windows.Controls;  
    using System.Windows.Documents;  
    using System.Windows.Input;  
    using System.Windows.Media;  
    using System.Windows.Media.Animation;  
    using System.Windows.Shapes;  
     
    namespace Sample  
    {  
        public partial class Sharp0 : UserControl  
        {  
            public Sharp0()  
            {  
                InitializeComponent();  
     
                //创建一个TextBlock元素  
                TextBlock txt1 = new TextBlock();  
     
                //声明txt1元素的属性  
                txt1.Text = "C# Dynamic Created!";  
                txt1.FontSize = 60;  
                txt1.Foreground = new SolidColorBrush(Colors.Black);  
     
                //在画布中创建这个TextBlock元素  
                parentCanvas.Children.Add(txt1);  
            }  
        }  
    }  
     

    这个例子的运行结果会创建一个TextBlock 文本对象,并显示“C# Dynamic Created!”文字!



    My blog: http://blog.csdn.net/dotfun http://dotfun.cnblogs.com

    My contact: QQ:372900288 E-mail:372900288@qq.com msn:sellnet007@hotmail.com

    2009年3月5日 16:17
    版主
  •  前台: XAML
    后台:C#、VB.NET、Ironruby、IronPython等.NET语系来开发。我只会C#
    打火机
    2009年3月6日 2:43
  •  页面展现 xaml 标记性语言  , 后台程序 vb.net 或 C#.net
    不以善小而不为,不以恶小而为之
    2009年3月9日 13:12
  • 前者曰"XAML",工属性,多标记,似冗实杂也.
    后者可用"C#,VB.NET,IRON RUBY"也

    2009年3月9日 13:54
  • 前台采用:XAML
    后台可用:C#、VB.NET等.NET语系来开发。
    2009年3月13日 9:45
  • 前台采用:XAML(eXtensible Application Markup Language)  可扩展应用程序标记语言
    后台可用:C#、VB.NET等.NET语系来开发。
    2009年3月13日 10:31
  • 前台界面采用: XAML语言可扩展应用程序标记语言。
    后台程序可用: C#,VB.NET以及一些动态语言如:ruby等

    2009年3月16日 17:44
  • 前台:XAML
    后台:.NET语系皆可,最好还是用C#,习惯了就OK.
    2009年3月22日 3:51
  •  

    Silverlight前台界面是使用XAML做为描述语言。
    1、XAML的概念和特点:
       XAML是eXtensible Application Markup Language的英文缩写,相应的中文名称为可扩展应用程序标记语言,它是微软公司为构建应用程序用户界面而创建的一种新的描述性语言。XAML提供了一种便于扩展和定位的语法来定义和程序逻辑分离的用户界面,而这种实现方式和ASP.NET中的"代码后置"模型非常类似。也就是说在开发一个应用程序时,我们可以将开发工作分成开发人员和设计人员两个团体分别进行,各自负责后台程序代码逻辑和前台程序界面的设计,这样就使得开发人员和设计人员之间的协作更通畅,也极大地发挥了他们的专长。

      提示:XAML的发音为"Zamel",笔者经常开玩笑地将其读成"折磨"。虽然XAML包含了许多新规则、元素和语法,但是我并不认为学习它是一个折磨人的过程。只要读者稍微具备一些HTML基础知识,就可以快速地掌握XAML中的大部分内容。

      提示:如今在WPF的官方网站上已经提供了一些很实用的工具,可以将其他格式的图形文件转换为XAML文件的形式。例如我们就可以将3DMax制作出的3D动画转换为XAML,这样WPF程序就可以直接通过转换好的XAML文件产生和3DMax制作出的3D动画相一致的效果。

      XAML简化了.Net Framework 3.0 编程模式上的用户界面创建过程,使用XAML开发人员可以对WPF程序的所有用户界面元素(例如文本、按钮、图像和列表框等)进行详细的定置,同时还可以对整个界面进行合理化的布局,这与使用HTML非常相似。但是由于XAML是基于XML的,所以它本身就是一个组织良好的XML文档,而且相对于HTML,它的语法更严谨、更明确。预计以后大部分的XAML都可由相应的软件自动生成,就如同我们现在制作一个静态页面时,几乎不用编写任何HTML代码就可以直接通过Dreamweaver软件生成一个美观的页面。但是最初通过手动编写XAML代码将是一次绝佳的学习体验,虽然实现的过程繁杂了些,但是将加深您对XAML语法和各个元素的理解。

      大多数的WPF程序可能同时包含程序代码和 XAML。我们可以使用XAML定义应用程序的初始界面,而后才编写相应的功能实现代码。我们可以将逻辑代码直接嵌入到一个XAML文件中,也可以将它保留在一个单独的文件中。实际上,能够用XAML实现的所有功能我们都可以使用程序代码来完成。因此,我们根本无需使用任何的XAML就可以创建一个完好的WPF程序。一般来说,程序代码的优势在于流程处理和逻辑判断,而不是界面的构建上。而XAML则是集中关注于界面的编程,我们可以将它和其它的.NET语言配合使用,从而构建出一个功能完善、界面美观的WPF程序。XAML是一种纯正的、用来描述用户界面构成元件和编排方式的标记语言。尽管有部分的XAML语法具备程序设计语言的特性(例如XAML中的Trigger和TRansform),但是XAML并不是一种用于程序设计的语言,它的功能也不是为了执行应用程序逻辑。

      XAML是一种解析性的语言,尽管它也可以被编译。微软推荐XAML被编译成BAML(Binary Application Markup Language-二进制语言程序标记语言)。XAML和BAML都可以被WPF解析,并且将以一种和HTML相似的方式进行界面的呈现。但是和HTML不同的是,XAML是强类型化的。也就是说,HTML会忽略那些它不能识别的元素和属性,而XAML必须在识别所有的元素和属性的情况下,才对页面进行呈现。尽管在XAML中各个属性都是以一个个的字符串(例如Background)表示的,但是这些字符串实际上代表的是WPF中的对象,只有被WPF识别的对象才可以作为元素的属性,所有我们说XAML是强类型化的。

      还有一点是我们反复强调的,XAML并不是HTML。尽管XAML在元素的声明、程序样式的设置和指定事件处理程序上都和HTML非常类似,但是XAML是基于XML的,它是WPF的外在表现形式。而HTML主是一种标记语言,仅仅是用来为浏览器呈现页面内容。XAML除了用来呈现信息和请求用户输入等基本的功能外,它还包含了一些高级的特性,例如它提供了对动画和3D众多方面的支持。

      XAML是可扩展的,正如它的名字指明的那样。开发人员可以创建自定义的控件、元素和函数来扩展XAML。而且由于XAML各元素在本质上就是WPF类的映射,所以开发人员可以很轻松地使用面向对象的技术对XAML元素进行扩展。也就是说我们可以开发一些自定义控件和组合元素,并将它公开给用户界面设计人员和其它的开发人员使用。
    2、XAML for Silverlight:
    Silverlight中的XAML和WPF不同,Silverlight中的XAML是从WPF完整的XAML中精简出来的,适用于WEB上的XAML语言,例如WPF中的Window在Silverlight中就没有实际意义。
    3、Silverlight后台语言:
    在x:Class关联的xxx.xaml.cs后台代码中可以使用C#、VB.NET、Ironruby、IronPython等.NET语系来开发,使用这些后台语言可以用来控制XAML界面中的实例,这些通过x:Name或Name来标记唯一性,类似ASP.NET Server控件的ID,所以一个XAML中不允许有重复的x:Name属性值,在Silverlight 2.0中还支持Linq和Linq to XML。
    4、完整例子:
    XAML:

    <UserControl x:Class="Sample.Sharp0" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
        Width="640" Height="300">  
        <Canvas x:Name="parentCanvas" Background="White"></Canvas> 
    </UserControl> 
     

    C#:

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Net;  
    using System.Windows;  
    using System.Windows.Controls;  
    using System.Windows.Documents;  
    using System.Windows.Input;  
    using System.Windows.Media;  
    using System.Windows.Media.Animation;  
    using System.Windows.Shapes;  
     
    namespace Sample  
    {  
        public partial class Sharp0 : UserControl  
        {  
            public Sharp0()  
            {  
                InitializeComponent();  
     
                //创建一个TextBlock元素  
                TextBlock txt1 = new TextBlock();  
     
                //声明txt1元素的属性  
                txt1.Text = "C# Dynamic Created!";  
                txt1.FontSize = 60;  
                txt1.Foreground = new SolidColorBrush(Colors.Black);  
     
                //在画布中创建这个TextBlock元素  
                parentCanvas.Children.Add(txt1);  
            }  
        }  
    }  
     

    这个例子的运行结果会创建一个TextBlock 文本对象,并显示“C# Dynamic Created!”文字!

    2009年3月24日 1:46
  •  一、Silverlight前台界面是使用XAML做为描述语言。

     XAML是一种陈述性语言。你可以使用XAML标记创建可视化的UI原件。 之后,你可以在一个单独的文件中使用JavasScript来操作你在XAML所声明的对象、响应一些事件。作为一种以XML为基础的陈述性语言,它创建界面时,从原型到产品的过程非常直观,尤其是对于有网页设计背景知识和技术的人。XAML文件通常是以.xaml为后缀的XML文件。下面是一个典型的Silverlight XAML文件例子。
         <UserControl x:Class="Silverlight20.Interactive.Mouse"
        xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml">
        
        
    <!--路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件-->
        
        
    <!--
        MouseLeftButtonDown, MouseLeftButtonUp和MouseMove均为向上冒泡的路由事件
        本例的事件路由为:Ellipse -> StackPanel -> UserControl 或 Rectangle -> Canvas -> StackPanel -> UserControl
        如果不想向上冒泡,则可以使用 MouseButtonEventArgs.Handled = true 告知事件已被处理
        
    -->
        
    <StackPanel HorizontalAlignment="Left" MouseLeftButtonDown="StackPanel_MouseLeftButtonDown" >

            
    <!--
            MouseEnter - 鼠标进入时触发的事件(显然,此事件不能冒泡)
            MouseLeave - 鼠标离开时触发的事件(显然,此事件不能冒泡)
            
            MouseLeftButtonDown - 鼠标左键单击按下时触发的事件
            MouseLeftButtonUp - 鼠标左键单击按下并放开时触发的事件
            MouseMove - 鼠标移动时触发的事件
            
    -->
            
    <Ellipse x:Name="ellipse" Width="200" Height="100" Fill="Red" Margin="5" 
                MouseEnter
    ="ellipse_MouseEnter" 
                MouseLeave
    ="ellipse_MouseLeave"
                MouseLeftButtonDown
    ="ellipse_MouseLeftButtonDown"
                MouseLeftButtonUp
    ="ellipse_MouseLeftButtonUp"
            
    >
            
    </Ellipse>

            
    <Canvas Margin="5">

                
    <!--用于演示拖放的矩形-->
                
    <Rectangle x:Name="rectangle" Fill="Blue" Width="50" Height="50"
                    MouseLeftButtonDown
    ="rectangle_MouseLeftButtonDown"
                    MouseLeftButtonUp
    ="rectangle_MouseLeftButtonUp"
                    MouseMove
    ="rectangle_MouseMove"
                
    />
                
            
    </Canvas>

        
    </StackPanel>
    </UserControl>

    二、Silverlight后台语言

    在x:Class关联的xxx.xaml.cs后台代码中可以使用C#、VB.NET、Ironruby、IronPython等.NET语系来开发,使用这些后台语言可以用来控制XAML界面中的实例,这些通过x:Name或Name来标记唯一性,类似ASP.NET Server控件的ID,所以一个XAML中不允许有重复的x:Name属性值,在Silverlight 2.0中还支持Linq和Linq to XML。

    完整例子:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;

    namespace Silverlight20.Interactive
    {
        public partial class Mouse : UserControl
        {
            public Mouse()
            {
                InitializeComponent();
            }

            void ellipse_MouseEnter(object sender, MouseEventArgs e)
            {
                ellipse.Fill = new SolidColorBrush(Colors.Yellow);
            }

            void ellipse_MouseLeave(object sender, MouseEventArgs e)
            {
                ellipse.Fill = new SolidColorBrush(Colors.Red);
            }

            private void ellipse_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
            {
                ellipse.Fill = new SolidColorBrush(Colors.Yellow);
            }

            private void ellipse_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
                ellipse.Fill = new SolidColorBrush(Colors.Blue);

                // MouseButtonEventArgs.Handled - 此事件是否已被处理
                //     false - 未被处理,事件的路由为向上冒泡
                //     true - 已被处理,事件的路由为不再冒泡
                e.Handled = true;
            }

            private void StackPanel_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
                // 如果鼠标单击 rectangle 对象,则 会 执行到此句
                // 如果鼠标单击 ellipse 对象,则 不会 执行到此句,因为之前 ellipse 对象的 MouseLeftButtonDown 事件中已经设置 e.Handled = true ,所以事件不会冒泡至此
                ellipse.Fill = new SolidColorBrush(Colors.Black);
            }
           


            // 是否正在捕获鼠标
            private bool _isMouseCaptured;

            // 鼠标垂直方向上的坐标
            private double _mouseY;

            // 鼠标水平方向上的坐标
            private double _mouseX;

            private void rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
                // MouseButtonEventArgs.GetPosition() - 鼠标相对于指定元素的坐标
                _mouseY = e.GetPosition(null).Y;
                _mouseX = e.GetPosition(null).X;

                // CaptureMouse() - 在指定的元素上捕获鼠标
                rectangle.CaptureMouse();
                _isMouseCaptured = true;
            }

            public void rectangle_MouseMove(object sender, MouseEventArgs e)
            {
                if (_isMouseCaptured)
                {
                    // 移动前和移动后的鼠标 垂直方向 和 水平方向 的位置的差值
                    double v = e.GetPosition(null).Y - _mouseY;
                    double h = e.GetPosition(null).X - _mouseX;

                    // 移动后的 rectangle 对象相对于 Canvas 的坐标
                    double newTop = v + (double)rectangle.GetValue(Canvas.TopProperty);
                    double newLeft = h + (double)rectangle.GetValue(Canvas.LeftProperty);

                    // 设置 rectangle 对象的位置为新的坐标.
                    rectangle.SetValue(Canvas.TopProperty, newTop);
                    rectangle.SetValue(Canvas.LeftProperty, newLeft);

                    // 更新鼠标的当前坐标
                    _mouseY = e.GetPosition(null).Y;
                    _mouseX = e.GetPosition(null).X;
                }
            }

            private void rectangle_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
            {
                // ReleaseMouseCapture() - 如果指定的元素具有鼠标捕获,则释放该捕获
                rectangle.ReleaseMouseCapture();
                _isMouseCaptured = false;
            }
        }
    }

     

    2009年3月25日 10:05