使用 WPF 和 WCF 在 Windows Vista 中创建货币转换器应用程序






3.82/5 (5投票s)
2007年4月12日
3分钟阅读

80386

2123
本文介绍如何使用 Windows Presentation Foundation (WPF) 和 Windows Communication Foundation (WCF) 技术实现一个简单的货币转换器应用程序。
引言
本文介绍如何使用 Windows Presentation Foundation (WPF) 和 Windows Communication Foundation (WCF) 技术实现一个简单的货币转换器应用程序。
货币转换器应用程序使用 WPF 来构建应用程序,该应用程序提供 Windows Vista 的应用程序 UI 体验,并使用 WCF 来使用 Microsoft 统一的 SOA 应用程序构建编程模型来消费 Web 服务。
背景
对 Windows Presentation Foundation (WPF) 和 Windows Communication Foundation (WCF) 技术进行简要介绍已超出本文的范围。简而言之,Windows Presentation Foundation (WPF) 为开发人员提供了一个统一的编程模型,用于构建包含 UI、媒体和文档的丰富的 Windows 智能客户端用户体验。Windows Communication Foundation (WCF) 是 Microsoft 用于构建面向服务应用程序的统一编程模型。它使开发人员能够构建安全、可靠、事务性的解决方案,这些解决方案可以跨平台集成并与现有投资进行互操作。
入门
创建货币转换器应用程序的先决条件如下:
- Visual Studio 2005
- .NET 3.0 Framework
- Visual Studio 2005 WCF、WPF 扩展
在本文中,货币转换器应用程序使用 WCF Web 服务客户端来消费 www.webservicex.net 货币转换器 Web 服务 (http://www.webservicex.net/CurrencyConvertor.asmx)。但如果您熟悉 WCF,可以创建自己的货币转换器 Web 服务,并将此应用程序指向您的 WCF Web 服务。
构建应用程序
货币转换器使用 XAML 前端,采用 Windows 应用程序 (WPF) 模板在 Visual Studio .NET 2005 中创建 WPF 客户端。货币转换器应用程序将使用 WCF Web 服务客户端调用 ConversionRate()
Web 方法。ConversionRate()
Web 方法接受两个参数:“源货币国家/地区代码”和“目标货币国家/地区代码”。
图 1:这是一个简单的 SOAP 请求
POST /CurrencyConvertor.asmx HTTP/1.1
Host: www.webservicex.net
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.webserviceX.NET/ConversionRate"
<envelope xmlns:soap=http://schemas.xmlsoap.org/soap/envelope/
xmlns:xsd=http://www.w3.org/2001/XMLSchema
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<body><conversionrate xmlns="http://www.webserviceX.NET/" />
<fromcurrency />
AFA or ALL or DZD or ARS or AWG or AUD or BSD or BHD or BDT or BBD or BZD or
BMD or BTN or BOB or BWP or BRL or GBP or BND or BIF or XOF or XAF or KHR or
CAD or CVE or KYD or CLP or CNY or COP or KMF or CRC or HRK or CUP or CYP or
CZK or DKK or DJF or DOP or XCD or EGP or SVC or EEK or ETB or EUR or FKP or
GMD or GHC or GIP or XAU or GTQ or GNF or GYD or HTG or HNL or HKD or HUF or
ISK or INR or IDR or IQD or ILS or JMD or JPY or JOD or KZT or KES or KRW or
KWD or LAK or LVL or LBP or LSL or LRD or LYD or LTL or MOP or MKD or MGF or
MWK or MYR or MVR or MTL or MRO or MUR or MXN or MDL or MNT or MAD or MZM or
MMK or NAD or NPR or ANG or NZD or NIO or NGN or KPW or NOK or OMR or XPF or
PKR or XPD or PAB or PGK or PYG or PEN or PHP or XPT or PLN or QAR or ROL or
RUB or WST or STD or SAR or SCR or SLL or XAG or SGD or SKK or SIT or SBD or
SOS or ZAR or LKR or SHP or SDD or SRG or SZL or SEK or CHF or SYP or TWD or
TZS or THB or TOP or TTD or TND or TRL or USD or AED or UGX or UAH or UYU or
VUV or VEB or VND or YER or YUM or ZMK or ZWD or TRY
</fromcurrency />
<tocurrency />
AFA or ALL or DZD or ARS or AWG or AUD or BSD or BHD or BDT or BBD or BZD or
BMD or BTN or BOB or BWP or BRL or GBP or BND or BIF or XOF or XAF or KHR or
CAD or CVE or KYD or CLP or CNY or COP or KMF or CRC or HRK or CUP or CYP or
CZK or DKK or DJF or DOP or XCD or EGP or SVC or EEK or ETB or EUR or FKP or
GMD or GHC or GIP or XAU or GTQ or GNF or GYD or HTG or HNL or HKD or HUF or
ISK or INR or IDR or IQD or ILS or JMD or JPY or JOD or KZT or KES or KRW or
KWD or LAK or LVL or LBP or LSL or LRD or LYD or LTL or MOP or MKD or MGF or
MWK or MYR or MVR or MTL or MRO or MUR or MXN or MDL or MNT or MAD or MZM or
MMK or NAD or NPR or ANG or NZD or NIO or NGN or KPW or NOK or OMR or XPF or
PKR or XPD or PAB or PGK or PYG or PEN or PHP or XPT or PLN or QAR or ROL or
RUB or WST or STD or SAR or SCR or SLL or XAG or SGD or SKK or SIT or SBD or
SOS or ZAR or LKR or SHP or SDD or SRG or SZL or SEK or CHF or SYP or TWD or
TZS or THB or TOP or TTD or TND or TRL or USD or AED or UGX or UAH or UYU or
VUV or VEB or VND or YER or YUM or ZMK or ZWD or TRY
</body>
</envelope>
ConversionRate()
Web 方法返回双精度类型的货币差额。
图 2:这是 SOAP 响应
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ConversionRateResponse xmlns="http://www.webserviceX.NET/">
<ConversionRateResult>double</ConversionRateResult>
</ConversionRateResponse>
</soap:Body>
</soap:Envelope>
在货币转换器应用程序中,XAML 窗口接收“源货币”和“目标货币”两个输入,如下图所示。
图 3:货币转换器应用程序窗口

上面的表单是使用 Visual Studio .NET 中的 WPF 客户端,通过选择 Windows 应用程序 (WPF) 模板应用程序项目类型创建的。
以下是货币转换器应用程序用户界面的完整 XAML。
图 4:CurrencyConverter.xaml
<Window x:Class="CurrencyConvertorApp.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Currency Convertor" Height="260" Width="497"
Icon =".\Icon1.ico">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.776951672862453*" />
<RowDefinition Height="0*" />
<RowDefinition Height="0.223048327137546*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.185267857142857*" />
<ColumnDefinition Width="0.339285714285714*" />
<ColumnDefinition Width="0.0334821428571429*" />
<ColumnDefinition Width="0.441964285714286*" />
</Grid.ColumnDefinitions>
<Label Height="25.96" HorizontalAlignment="Left" Margin="14.0066666666667,25.04,0,0"
Name="label1" VerticalAlignment="Top" Width="98.9933333333333"
Grid.ColumnSpan="2">From Currency:</Label>
<Label Height="25.96" HorizontalAlignment="Left" Margin="15.0066666666667,60.04,0,0"
Name="label2" VerticalAlignment="Top" Width="83.9933333333333"
Grid.ColumnSpan="2">To Currency:</Label>
<ComboBox Height="26" Margin="39,25,23,0" Name="cmbFromCurrency"
VerticalAlignment="Top" Grid.Column="1" Grid.ColumnSpan="3" />
<ComboBox Height="26" Margin="38,62,24,0" Name="cmbToCurrency"
VerticalAlignment="Top" Grid.Column="1" Grid.ColumnSpan="3" />
<Button Margin="96.0000000000001,0,26.9999999999999,49.8141263940521"
Name="btnConvert" Click="OnClick_Convert" Grid.Column="3"
Height="28.7397769516729" VerticalAlignment="Bottom">Convert</Button>
<TextBox Margin="22,0,17,25.3940520446097" Name="txtResults" Grid.ColumnSpan="4"
Height="59.4758364312266" Grid.RowSpan="3" VerticalAlignment="Bottom"></TextBox>
</Grid>
</Window>
要创建 WCF 服务的客户端应用程序,需要执行以下步骤:
-
获取服务的服务协定、绑定和地址信息。
-
使用该信息创建 WCF 客户端。
-
调用操作。
-
关闭 WCF 客户端对象。
如果您要创建一个 WCF 客户端对象来调用货币转换器服务,并且知道该服务的元数据发布在 http://www.webservicex.net/CurrencyConvertor.asmx?wsdl,那么 `svcutil.exe` 工具是 WinFX SDK 的一部分。要使用该工具,请在 Microsoft Windows SDK 程序下打开命令提示符,然后运行 `svcutil.exe`,并将 `currencyconverter.asmx` WSDL URI 作为参数传递。这将生成两个文件:`app.config` 和 `clientcode.cs`。
图 5:WCF 客户端应用程序 ServiceModel 元数据实用工具
svcutil /language:cs /out:ClientCode.cs /config:app.config
http://www.webservicex.net/CurrencyConvertor.asmx?wsdl
- `app.config` 包含设置通信通道和绑定所需的信息。
- `ClientCode.cs` 是代理实现,包含 `currencyconverter.asmx` 的所有托管代码中的服务协定。
将这两个文件包含在货币转换器应用程序项目中,并创建 CurrencyConverterSoapClient
类的实例,然后调用 ConversionRate()
Web 方法。创建 try/catch 块,以与本地对象相同的方式调用操作,并关闭 WCF 客户端对象。当客户端应用程序调用第一个操作时,WCF 会自动打开底层通道,并且当对象被回收时,底层通道会被关闭。
使用代码
下面的代码片段显示了从 WPF 转换按钮单击时使用 WCF 客户端的调用。
void OnClick_Convert(object sender, RoutedEventArgs e)
{
try
{
double dResult = 0;
//store the default brush for the convert button before call
Brush dbrush=this.btnConvert.Background;
//change the background of convert button before call
this.btnConvert.Background = Brushes.LightBlue;
//create the CurrencyConvertor webservice
CurrencyConvertorSoapClient wsCurrencyConverter =
new CurrencyConvertorSoapClient();
//call the webmethod
dResult = wsCurrencyConverter.ConversionRate
((Currency)Enum.Parse(typeof(Currency),
cmbFromCurrency.SelectionBoxItem.ToString().Substring(0, 3)),
(Currency)Enum.Parse(typeof(Currency),
cmbToCurrency.SelectionBoxItem.ToString().Substring(0, 3)));
txtResults.Text = cmbFromCurrency.SelectionBoxItem.ToString() +
" To " + cmbToCurrency.SelectionBoxItem.ToString() +
" = " + Convert.ToString(dResult);
//change back the to default brush
this.btnConvert.Background = dbrush;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK);
}
}
参考文献
- Windows Presentation Foundation (WPF) http://msdn2.microsoft.com/en-us/library/ms742119.aspx
- Windows Communication Foundation (WCF) http://msdn2.microsoft.com/en-us/library/ms735119.aspx