在开始之间,先说下程序增加的一个小功能,就是给容器增加网格线的功能,使得容器看上去类似下面的样子
当然可以有两种方法来实现,一种就是使用背景图片,但本文一贯的原色就是少用图片,多用silverlight的画图功能来实现,这些网格都可以使用xaml中的Line对象来实现。为此我们需要动态设定一个Canvas,然后把这些动态生成的Line对象添加到Canvas中,最后再把Canvas添加到容器里面,这里讲的比较简单,但是在程序中,还需要考虑回滚,Zindex的影响。下面的代码描述了动态增加网格线的功能。
首先我们需要两个webservices服务,一个用户从服务器端下载流程xml描述文件,另一个将用户本地的流程xml描述更新到服务。
这个工作涉及到两个部分,首先在客户端需要作一些修改以适应目前这种情况。
另一个部分就是服务器端增加新的方法来持久化数据
在ShareDesigner.Web项目中增加一个WorkFlow.asmx服务页,增加两个服务接口方法。如下所示:
public class WorkFlow : System.Web.Services.WebService
{
/// <summary>
/// 获取工作流xml描述
/// </summary>
/// <param name="workflowID">流程ID</param>
/// <returns></returns>
[WebMethod]
public string GetWorkFlowXML(string workflowID)
{
return "";
}
/// <summary>
/// 更新流程xml
/// </summary>
/// <param name="workFlowXml">流程xml描述</param>
[WebMethod]
public void UpdateWorkFlowXML(string workFlowXml)
{
}
}
客户端首先添加webservices引用,名称空间为ServicesClient
l 从服务器获取工作流xml描述
if (!string.IsNullOrEmpty(WorkFlowUrlID))
{
System.ServiceModel.BasicHttpBinding bind = new System.ServiceModel.BasicHttpBinding();
System.ServiceModel.EndpointAddress endpoint = new System.ServiceModel.EndpointAddress(
new Uri(System.Windows.Browser.HtmlPage.Document.DocumentUri, "services/workflow.asmx"), null);
ServicesClient.WorkFlowSoapClient wfClient = new Shareidea.Web.UI.Control.Workflow.Designer.ServicesClient.WorkFlowSoapClient(bind, endpoint);
wfClient.GetWorkFlowXMLCompleted += new EventHandler<Shareidea.Web.UI.Control.Workflow.Designer.ServicesClient.GetWorkFlowXMLCompletedEventArgs>(wfClient_GetWorkFlowXMLCompleted);
wfClient.GetWorkFlowXMLAsync(WorkFlowUrlID);
}
在上面的代码中,WorkFlowUrlID是一个属性,如下所示:
public string WorkFlowUrlID
{
get
{
if (System.Windows.Browser.HtmlPage.Document.QueryString.ContainsKey("id"))
return System.Windows.Browser.HtmlPage.Document.QueryString["id"].ToString();
return "";
}
}
这表明,根据从url传递的id值从服务器获取工作流描述。一个常见的访问场景如下所示:
http://localhost/ ShareDesinger.aspx?id=1234567
l 更新xml描述到服务器
System.ServiceModel.BasicHttpBinding bind = new System.ServiceModel.BasicHttpBinding();
System.ServiceModel.EndpointAddress endpoint = new System.ServiceModel.EndpointAddress(
new Uri(System.Windows.Browser.HtmlPage.Document.DocumentUri, "services/workflow.asmx"), null);
ServicesClient.WorkFlowSoapClient wfClient = new Shareidea.Web.UI.Control.Workflow.Designer.ServicesClient.WorkFlowSoapClient(bind, endpoint);
wfClient.UpdateWorkFlowXMLCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(wfClient_UpdateWorkFlowXMLCompleted);
wfClient.UpdateWorkFlowXMLAsync(ToXmlString());
其中使用到了更新方法的回调,方法如下:
void wfClient_UpdateWorkFlowXMLCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
System.Windows.Browser.HtmlPage.Window.Alert(Text.Message_Saved);
}
需要注意的是,在这里并没有做异常的处理逻辑,留待以后添加吧。