wpf客户端_WPF作为富客户端技术

WPF(Windows Presentation Foundation)是.NET框架的一部分,用于构建Windows应用程序。它的数据绑定和XAML(可扩展应用程序标记语言)特性使其成为显示以Java、Python等技术编写的后端服务信息的理想选择。WPF提供了与Web、Swing、Flash等技术相比较的独特优势,如高级数据绑定和集成多种UI功能。尽管WPF提供了强大的功能,但需要考虑客户端的.NET 3.0兼容性和内存需求。WPF可以作为独立应用或XAML浏览器应用程序(XBAP)部署,并能直接绑定到XML数据源,提供丰富的数据可视化和交互性。
摘要由CSDN通过智能技术生成

wpf客户端

Windows Presentation Foundation WPF是用于构建Windows应用程序的.NET API。 关于WPF如何使创建视觉上令人印象深刻的应用程序比以往任何时候都容易得多,但是WPF具有其他才能,尽管不那么引人注目,但却使WPF成为构建前端的强大技术。 特别是,.NET框架对连接系统的强大支持与WPF的数据绑定方法相结合,使其成为显示以任何技术(例如Java,Ruby或.NET)编写的后端服务中的信息的理想选择。

在本文中,我们将把WPF与Ajax / DHTML,Swing和Flash等替代方案进行比较。 然后,我们将研究一些场景,在这些场景中,您可以使用基于Java的后端服务来有效地将WPF前端构建为富客户端。

WPF简短指南

WPF是用于构建富客户端应用程序的平台。 它是.NET 3.0 Framework的一部分,因此它内置于Windows Vista中,也可以安装在Windows XP Service Pack 2和Windows 2003上。WPF用户界面构造为.NET对象模型。 但是,WPF提供了XAML(可扩展应用程序标记语言),它是一种标记语言,允许将用户界面的外观与定义其行为的代码分开设计。 两种方法都等效,XAML只是一种替代语法。 但是,XAML语法旨在使工具易于创建和使用,其目的是通过创建工具来使设计人员能够直接参与创建用户界面,而无需编码技能。

(有关WPF的更多详细信息,请参见http://wpf.netfx3.com/

WPF不是.NET中第一个可用的富客户端API。 但是,它的前身Windows Forms本质上是Win32窗口系统之上的.NET层。 尽管Windows窗体在Win32之上添加了许多功能,但是它仍然受到底层UI平台中某些限制的约束。 WPF不在Win32的窗口系统上构建。 相反,它建立在DirectX上,这使它能够利用本地计算机的图形卡的全部功能。 但是,WPF不仅仅是外观精美的应用程序。

WPF最大的好处就是将许多富客户端功能集成到一个平台中。 这些功能中的大多数已在其他UI技术中单独使用了一段时间。 例如,WPF提供动画矢量图形和视频,这一直是Flash的特长。 WPF提供了普通的Windows控件,例如按钮,列表框和树视图,这些控件已经在Win32和Windows窗体中使用了很多年。 它提供了流畅的文本布局,这是HTML从一开始就完成的工作。 (尽管WPF的文本呈现比今天HTML和CSS先进得多。)WPF的标记+代码隐藏式应用程序构建样式也直接来自面向HTML的技术,例如JSP和ASP.NET。 它具有一些基本的3D支持,但是OpenGL和DirectX多年来已经能够执行更高级的3D渲染。

WPF的前辈都擅长于自己的工作,但是在单个应用程序中使用多种技术的功能非常困难。 将Flash的动画功能与Windows按钮和组合框结合使用非常困难。 (Flash应用程序倾向于定义自己的控件,但是这些控件通常无法在视觉上与用户选择的OS视觉主题进行集成,它们经常无法访问,并且其行为通常与实际控件不一致。)在富客户端中使用数据绑定与HTML提供的文本布局服务结合使用的应用程序不受很好的支持。 通常,当您尝试混合技术时,您的应用程序最终会分成多个不同的世界。 使任何事情跨越鸿沟最多是不便的,而且通常是不可能的。

相比之下,WPF使此操作变得容易。 不幸的是,许多公开可用的WPF示例在某种程度上免费地展示了这种集成。 将全动态视频包装到一个旋转的多维数据集上,该多维数据集构成嵌入在流布局文档中间的正常外观的Windows按钮标题的一部分,这可能是一个令人信服的演示,表明可以将各种不同的UI功能整合在一起,但是这也引发了一个问题:在他们的正确思维中,谁会以这种方式设计真正的应用程序?

实际上,您不太可能将所有可能的UI功能集成到应用程序中。 这样做会让人想起Web的早期时代,当时许多站点会在不加思索的情况下尝试使用每种可能HTML功能。 结果太可怕了。 花了一些时间来学习如何最好地使用该技术来构建良好的Web应用程序。 同样,自由组合使用WPF的视觉功能是强大而自由的,但是构建有用的应用程序将需要一点趣味和约束。 此外,WPF甚至可以为视觉上不太冒险的应用程序提供很多功能。

为什么要构建WPF前端?

为了有意义地讨论为什么您可能想要构建WPF前端,我们需要将其与一些替代方案进行比较。 一些明显的候选技术将是Web,Swing,Flash,Windows Forms甚至Win32。

与Web前端相比,WPF可以实现更高质量的交互性。 交互式Web应用程序的标准最近得到了改善,但是尽管AJAX提供的交互行为比经典的普通HTML更好,但实际上并不能说太多。 我们已经非常习惯于网络,以至于我们几乎没有注意到它的许多令人震惊的交互问题,并且我们被那些仅仅管理不吸引人的网站所震惊。 即使是同类最佳的AJAX应用程序,也可以提供丰富的客户端标准所认为的非常普通的用户体验。 而且,尽管AJAX工具正在突飞猛进,但与使用富客户端技术产生的效果至少一样,与AJAX一起提供令人满意的交互体验仍需要付出更多的努力。 此外,即使客户端计算机与网络断开连接,WPF应用程序也可以工作。 正在为解决Web应用程序的问题而采取行动,但是如今,富客户端应用程序为具有间歇性连接的用户提供了唯一令人信服的解决方案。

与Swing相比,WPF具有两个显着的好处。 首先是WPF的数据绑定系统,尤其是XML绑定和数据模板功能,本文稍后将对此进行讨论。 第二个优点是一把双刃剑,这也是您可能不想使用WPF的原因:WPF设计为仅在Windows上运行。 这意味着它能够充分利用本地PC的功能,尤其是图形硬件的功能。 这样就可以实现诸如高级数据可视化的高性能渲染,或动画和视频等更多修饰的功能。

尽管Flash可以提供与WPF相同的功能,例如动画和视频播放,但是如果要构建外观和行为类似于普通Windows程序的应用程序,则功能较弱。 WPF的一大优势是,它既提供高级视觉功能,又提供标准的Windows控件集,这些控件的行为与用户期望的方式相同,允许您在单个应用程序中自由混合使用这两种控件。

与其他Windows特定的富客户端技术(例如Windows窗体或经典的Win32开发)相比,WPF提供了更好的数据绑定功能,并使生成丰富的数据可视化变得更加容易。 尽管WPF提供了许多好处,但是您也可能出于某些原因选择不使用它。

为什么不构建WPF前端?

WPF最可能的阻止者是客户端上的.NET 3.0不可用。 WPF应用程序绝对需要在最终用户的计算机上安装.NET 3.0 Framework。 如果需要支持运行Windows以外的操作系统的用户,或者使用的Windows版本早于Windows XP Service Pack 2,则可以排除WPF。 即使客户端计算机运行的是Windows的合适版本,您也可能无法安装.NET 3.0。

(即使将WPF排除在外,也可能不排除WPF / E。这是一个UI平台,提供了WPF功能的精简部分。“ E”代表Everywhere,因为它将在非Microsoft平台(包括Firefox)上运行Web浏览器和Mac OSX。但是,它尚未交付使用,从而限制了它的实用性。实际上,第一个公开预览版仅在撰写本文时才交付使用。因此,对于WPF / E来说还处于早期状态,不是您现在可以建立的东西。)

需要牢记的另一点是典型WPF应用程序的内存占用量。 查看当前在我的计算机上运行的WPF应用程序,它们的工作集大小都与Microsoft Office套件应用程序竞争,争夺“最大内存消耗”的称号。 (而且这些特定的WPF应用程序都比任何Office应用程序都具有明显更少的功能。)如果您需要支持内存配置较小的客户端计算机,则WPF可能不是最佳选择。

您可能还需要考虑是否要采用“另一种技术”。 如果您已经在使用.NET,WPF就是吸引人的地方,因为它只是.NET世界的另一部分,因此相对容易学习和采用。 但是,如果您尚未在系统中使用.NET,则需要考虑潜在的好处是否超过了开发人员需要了解的一组技术的成本。

但是,假设没有这些阻止因素适用,并且所带来的好处是值得的,下一步就是考虑您可以构建哪种WPF应用程序。

应用程序类型和部署选项

WPF应用程序有几种形式。 他们可能会提供具有类似Web导航功能的UI,或者可能会选择更为传统的面向表单的样式。 它们可以作为独立的应用程序运行,也可以完全托管在浏览器框架中。 对于如何部署应用程序,有多种选择。

富客户端应用程序的传统样式在其自己的窗口中运行,而不是在Web浏览器中运行,并且可以从“开始”菜单的“程序”列表中启动。 您可以使用这种样式而不会丢失典型Web应用程序的中央更新模型:WPF能够使用.NET框架的“ ClickOnce”部署技术,从而使更新可以部署到Web服务器,并由客户端计算机自动下载。

如果您已经建立了基于Web的Java应用程序,则独立的WPF应用程序可能看起来有点不合适。 在这种情况下,您可以通过构建一个或多个浏览器托管的导航样式WPF应用程序来开始利用WPF而不会破坏整体应用程序结构。 这种应用程序称为“ XBAP”-XAML浏览器应用程序。 (如前所述,XAML是通常用于构造WPF用户界面的标记语言。)这是与Java Applets非常相似的模型:XBAP可以嵌入到网页中,或者可以代表整个网页,无论哪种情况,它都托管在安全的沙箱中。 您可以使用XBAP扩展或替换Web应用程序的某些部分,同时保留整个信息体系结构。 这避免了对WPF采取全有或全无的方法,而仅在提供最大收益的地方采用它。 通过为此类客户端提供普通网页而不是XBAP,您还可以为没有.NET 3.0的客户端提供后备UI。

另一个选择是纯标记方法。 无需构建XBAP(始终是已编译的应用程序),而只需生成XAML。 如果Web服务器提供XAML页面,则只要客户端支持WPF,它就会解析并呈现内容。 这可能提供了一种特别简单的方式来合并WPF内容:如果您的Web服务器内容管理系统支持使用XSLT生成网页的功能,则您可以对其进行调整以从基础源材料生成XAML以及HTML。

如果您是从头开始构建新的应用程序,那么采用WPF零碎的功能就没什么用处了。 在这种情况下,您可能会选择一个独立的客户端应用程序。 这就提出了一个问题,即客户端应用程序将如何与Java服务进行通信。

将客户端连接到服务器

WPF是.NET 3.0框架的一部分,该框架还包括WCF。 (Windows Communication Foundation是一种用于使用和创建分布式服务的技术,它支持多种Web服务标准。)这提出了一种将WPF客户端连接到Java服务器的明显策略:在客户端上使用WCF的XML Web服务侧。 但是,这不是唯一的选择。 (这也是一样,因为在某些情况下,您可能无法使用WCF。WCF当前不支持部分信任方案,例如,您不能在XBAP中使用它。)

您还可以使用.NET 2.0样式的Web服务客户端功能。 WPF的数据绑定系统与使用WCF一样满意。 确实,它并不真正在乎数据的来源。 使用任何旧的对象集作为数据源都是很高兴的。

除了能够绑定到对象之外,WPF还对直接将数据绑定到XML数据提供了出色的支持。 这使得POX(普通的旧XML)方法非常可行。 下一部分显示了一个简单的示例。

XML数据绑定

WPF能够直接绑定到XML作为数据源。 它不需要以任何方式包装它。 为了说明这一点,我们将绑定到一种非常简单但非常流行的XML数据形式:RSS。 当然,世界上有许多由各种不同技术产生的RSS的不同来源。 在以下示例中,我们将使用来自Sun开发人员站点的RSS feed。 (假设这家特定服务器中的某处可能涉及Java,这似乎是安全的。)这是WPF用户界面的XAML片段,它提供来自RSS feed的一些信息:

<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放入应用程序中。

这个示例中最有趣的部分是嵌套在StackPanel内部的一对TextBlock元素。 (一个StackPanel是一个布局组件,将其子项安排在一个垂直的堆栈中。)每个TextBlock元素都绑定到部分源XML文档中-在每种情况下,连接都用'{Binding ...}'描述。句法。 这些元素中的XPath表达式相对于示例顶部附近的XmlDataProvider元素中的XPath表达式。 因此,第一个文本块实质上是对表达式/ rss / channel / title求值,并将结果表示为文本。 这是整个示例的外观。

在此示例中,我们无需对XML数据做任何事情-我们只是从Web上以原始格式获取了它。 WPF的数据绑定服务使我们可以将XPath表达式直接指向我们希望显示的数据。 这种方法适用于以XML形式公开数据的任何服务(Java或其他)。

此示例仅显示源中的单个信息。 通过利用另一个WPF数据绑定功能:数据模板,我们可以花更多的精力来制作更有趣的东西。

资料范本

数据模板是有关如何呈现数据的可重用描述。 您可以将数据模板应用于多个项目,例如列表中的每个项目,以便始终如一地呈现信息。 可以将以下示例添加到上一示例的StackPanel中。 这将创建一个ListBox控件,在这种情况下,其控件是RSS feed中“ 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>

列表中的每个项目都由一个DataTemplate呈现,在此示例中,已在ListBox中内联指定了DataTemplate。 该模板显示了如何排列和格式化每个项目,以及从项目中提取哪些数据。 结果如下:

这几乎没有刮擦数据模板可以直观完成的工作。 您可以自由地在数据模板中使用任何WPF功能,因此您绝不限于文本。 数据模板可以包含例如图像,图形元素,动画或3D内容。 您还可以添加交互式控件,例如允许编辑数据的文本框,或提供所需交互作用的自定义控件。

如您所见,数据模板提供了一种非常简单的方式来格式化服务返回的数据列表。 您可以像本示例一样将它们直接应用于纯XML数据。 您还可以将它们与对象一起使用,例如WCF Web服务包装器返回的对象。

Web服务和对象数据绑定

直接绑定到XML的功能可能会很有用,但是有时使用某种包装对象有时会更方便。 如果您正在使用提供WSDL定义的Web服务,则通常可以使用工具来生成此类包装器。 然后,您可以使用WPF的基于对象的数据绑定来绑定到这些对象,而不是直接绑定到原始XML。

例如,eBay提供了其Web服务API的WSDL定义,您可以从此处下载: http : //developer.ebay.com/webservices/latest/eBaySvc.wsdl (您需要注册其服务才能使用API​​,但可以免费下载WSDL。)eBay的后端使用Java,如服务器标头和服务器返回的错误消息所示。 由于它是一个Web服务,因此以Java实现的事实对客户端技术没有任何限制。 因此,您可以将WSDL导入.NET客户端。

您可以使用自最早的.NET版本以来一直可用的Web服务支持。 或者,您可以使用.NET 3.0附带的新WCF(Windows Communication Foundation)工具。 两种技术都提供了可以为WSDL中定义的消息和相关类型生成类似包装类的工具。 eBay Web服务API中的一种此类类型是UserType,它提供有关用户的信息。 工具为此生成的包装器从XML中提取元素值,并将其显示为.NET属性。 然后,我们可以从WPF绑定到这些文件。 以下标记将UI绑定到UserType中的某些属性。 (此示例假定应用程序中某处的某些代码已从Web服务获取了UserType实例,并将其放入UI的“数据上下文”中,使其可用于绑定目的。)

<Grid TextElement.FontSize="20">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="10" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>

<TextBlock Grid.Column="0" Grid.Row="0" Text="User ID:" />
<TextBlock Grid.Column="2" Grid.Row="0" Text="{Binding Path=UserID}" />

<TextBlock Grid.Column="0" Grid.Row="1" Text="Email:" />
<TextBlock Grid.Column="2" Grid.Row="1" Text="{Binding Path=Email}" />

<TextBlock Grid.Column="0" Grid.Row="2" Text="Feedback score:" />
<TextBlock Grid.Column="2" Grid.Row="2" Text="{Binding Path=FeedbackScore}" />

<TextBlock Grid.Column="0" Grid.Row="3" Text="Registration date:" />
<TextBlock Grid.Column="2" Grid.Row="3" Text="{Binding Path=RegistrationDate}" />
</Grid>

注意,我们现在在绑定表达式中指定“ Path = ...”,而不是在绑定表达式中指定“ XPath = ...”。 这向WPF表示我们希望源数据位于对象的属性中,而不是XML形式。 上面的标记显示了用户信息,如下所示:

采用这种对象包装方法的优势在于,它使客户端比仅显示数据更容易执行更多操作。 WPF应用程序通常包含标记和代码。 利用从XML提取的Web服务中的数据并将其包装在对象中,代码可以轻松地处理这些数据并提供应用程序所需的任何客户端行为。

结论

我们研究了两个非常简单的示例,这些示例在Java服务之上提供了WPF前端。 我们利用的主要WPF特定功能是数据绑定,它提供了一种非常方便的方法来将从服务检索到的数据连接到UI。 像任何富客户端应用程序一样,WPF应用程序当然可以提供我们想要的任何客户端智能和行为。 尽管这些示例故意使用极其简单的视觉效果来强调WPF不仅仅是一张漂亮的脸蛋,但WPF可以利用平淡而有用的数据绑定和普通Windows控件世界,并通过丰富的视觉呈现对其进行增强。

有关与.NET和Java集成方案有关的其他内容,另请参见InfoQ上的特殊J + N内容页面

翻译自: https://www.infoq.com/articles/wpf-rich-client-java/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

wpf客户端

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值