Yesky首页| 产品报价| 行情| 手机 | 数码 | 笔记本 | 台式机 | DIY硬件 | 外设 | 网络 | 数字家庭 | 评测 | 软件 | e时代 | 游戏 | 图片 | 壁纸 | 群乐 | 社区 | 博客 | 下载
软件频道>程序开发>JavaVBVCDelphiC/C++Web开发微软专栏移动数据库程序人生软件工程|产品中心下载程序生命周期管理
您现在的位置: 天极网 > 开发频道 > 把WPF作为一种富客户端技术
全文
群乐:.NET天空

把WPF作为一种富客户端技术

2008-04-22 09:29 作者: infoQ 赵劼 出处: 天极网 责任编辑:>孙蓬阳

  将客户端连接至服务器

  WPF是.NET 3.0框架的一部分,而框架中也包含了WCF(Windows Communication Foundation是一个用于开发和使用分布式服务的技术,它支持数量可观的Web服务标准)。于是我们得到了一个非常明显的策略,可以将一个WPF客户端连接至Java服务器:在客户端使用XML Web服务。不过这并不是唯一的选择(不过最好还是使用WCF,可惜在某些情况下您无法使用WCF。例如目前WCF不能支持部分信赖的场景,这意味着它不能在XBAP中使用)。

  您也可以在客户端使用.NET 2.0的方式来连接Web服务,WPF的数据绑定系统能够同时支持WCF和这种方式。事实上,数据绑定系统完全不会关心这些数据从何而来。您也可以使用一些传统方式作为数据源,例如对象集合。

  除了将对象作为数据源之外,WPF还对直接绑定XML数据有着极好的支持。这使POX(Plain Old XML)方式变得完全可行。下一部分将会展示一个简单的示例。

  XML数据绑定

  WPF能够直接使用XML作为数据源而不许要将其转换为其他任何形式。为了展示这个特性,我们来绑定一个非常简单但又很常见的XML数据:RSS。世界上有无数RSS数据源,它们使用不同的技术生成。在下面的例子中我们会使用Sun公司开发人员站点中的RSS源(这确保服务器上的数据是使用Java生成的)。

 

以下是引用片段:
  <Border BorderBrush="Black" BorderThickness="1" Padding="2">
   <Border.Resources>
     <XmlDataProvider x:Key="source" XPath="/rss/channel"
Source="http://developers.sun.com/rss/java.xml" />
   </Border.Resources>
   <StackPanel DataContext="{StaticResource source}">
     <TextBlock Text="{Binding XPath=title}" FontSize="18"
                FontWeight="Bold" Margin="0,5" />
     <TextBlock Text="{Binding XPath=description}"
                TextWrapping="Wrap" />
   </StackPanel>
</Border> 
  该XML数据源的URL在这里被硬编码在XmlDataProvider元素中,这样可以让示例显得简单一些——在实际的应用程序中,我们可以使用许多不同的方法来获取XML。

  这个例子中最有趣的部分是一对TextBlock元素内嵌在了StackPanel中(StackPanel是一个布局组件,它将自身的子元素排列在一个纵向的栈中)。每个TextBlock元素将与XML数据源的一部分绑定——这种关系使用“{Binding...}”语法来描述。这些元素中的XPath表达式都相对于示例中XmlDataProvider里的XPath表达式,因此第一个TextBlock会解析表达式“/rss/channel/title”,并将结果表示为文本。以下是这个示例生成的结果:

  

  在这个例子里我们不需要对XML数据作任何处理——我们只需直接将它从Web上获取下来即可。WPF的数据绑定服务让我们使用XPath表达直接获取想要展现的数据。这个做法能与任何发布XML数据的服务(Java或其他技术亦可)相结合。

  这个例子仅仅展示了RSS源中的单一信息。我们只需一点额外的工作就可以生成一些更有意思的东西,因为我们可以利用WPF数据绑定功能的另一个特性:数据模版。

  数据模版

  数据模版是一个可重用的,用于描述展示一段数据的方式。您可以把同一个数据模版运用在多个项目中,例如一个列表中的多个项目,这样可以让这些项目的展示方式保持统一。下面的例子能被添加到上个例子中的StackPanel元素中。下面的代码创建了一个ListBox控件,在这个例子中,它的项目与RSS源中的每个“item”元素一一对应。

以下是引用片段:
   <ListBox ItemsSource="{Binding XPath=item}"
          ScrollViewer.HorizontalScrollBarVisibility="Disabled">
   <ListBox.ItemTemplate>
     <DataTemplate>
         <Grid Margin="2,8">
           <Grid.RowDefinitions>
             <RowDefinition />
             <RowDefinition />
             <RowDefinition />
           </Grid.RowDefinitions>
           <Grid.ColumnDefinitions>
             <ColumnDefinition Width="80" />
             <ColumnDefinition />
           </Grid.ColumnDefinitions>

            <TextBlock Grid.Row="0" Grid.Column="0" Text="Title:" Margin="0,0,0,6" />
           <TextBlock Grid.Row="1" Grid.Column="0" Text="Description:" />
           <TextBlock Grid.Row="2" Grid.Column="0" Text="Link:" />
            <TextBlock Grid.Row="0" Grid.Column="1" FontWeight="Bold" FontSize="14"
                      Text="{Binding XPath=title}" TextWrapping="Wrap" />
           <TextBlock Grid.Row="1" Grid.Column="1"
                      Text="{Binding XPath=description}" TextWrapping="Wrap" />
           <TextBlock Grid.Row="2" Grid.Column="1" Foreground="Blue"
                      Text="{Binding XPath=link}" TextDecorations="Underline" />
         </Grid>
     </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

  Each item in the list is presented by a DataTemplate, which in this example has been specified inline inside the ListBox. This template shows how to arrange and format each item, and which pieces of data to extract from the item. The results look like this:

  列表中的每个项目都使用同一个DataTemplate进行展示,在这个例子中即为ListBox里内嵌的DataTemplate。这个模版展示了排列和格式化每个项目的方式,以及应该如何从每个项目中提取数据。这些做法生成了如下结果:

  

  这个例子仅仅表现了数据模版呈现方式的皮毛。事实上数据模版的表现能力完全不限于文本,您可完全自由地在数据模版中使用WPF的任何功能,例如数据模版能够与图片、图像元素、动画或3D内容等等一起工作。您也可以添加交互式的控件,例如提供用户可编辑的文本框,或者按照您的想法来表现的自定义控件。

  正如您所看到的那样,数据模版提供了一个无比简单的方式,能够轻松地将从外部服务中获取到的列表数据进行格式化呈现。您可以像上面的例子那样将其运用在纯粹的XML数据里,您也可以从WCF Web服务那里获得数据对象后一起使用。

共4页。 9 1 2 3 4 :
网友关注
最新上市
编辑推荐
欢迎订阅天极网RSS聚合资讯:http://www.yesky.com/index.xml