如何利用Silverlight开发动态流程图下载工具?

2026-05-25 09:193阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1690个文字,预计阅读时间需要7分钟。

如何利用Silverlight开发动态流程图下载工具?

首先祝福一下,源代码在CodePlex上下载量超过1000%,此外还有许多演示程序放在微软免费的Silverlight Host上,您也可以申请免费空间。地址在http://silverlight.live.com/,技术支持QQ群:85444465,源代码。

首先庆祝一下源代码在codeplex上下载量超过1000

另外本演示程序放在微软免费的silverlight host上面,您也可以申请免费的空间。

地址在silverlight.live.com/

技术支持QQ群:85444465

源代码下载:www.shareidea.net/opensource.htm

在线演示:www.shareidea.net/workflow.htm

如何利用Silverlight开发动态流程图下载工具?

视频教程: www.shareidea.net/video/sharedesigner/sharedesigner.html

本文系列索引:

使用silverlight构建一个工作流设计器(一)

使用silverlight构建一个工作流设计器(二)

使用silverlight构建一个工作流设计器(三)

使用silverlight构建一个工作流设计器(四)

使用silverlight构建一个工作流设计器(五)

使用silverlight构建一个工作流设计器(六)

使用silverlight构建一个工作流设计器(七)

使用silverlight构建一个工作流设计器(八)

使用silverlight构建一个工作流设计器(九)

使用silverlight构建一个工作流设计器(十)

使用silverlight构建一个工作流设计器(十一)

使用silverlight构建一个工作流设计器(十二)

使用silverlight构建一个工作流设计器(十三)

9.1问题描述

今天有网友问,这个工作流设计器能不能生成对应的图片呢?我想不出生成图片能有什么作用,如果想用图片,我们大可以使用拷屏的方法保存到画图中,然后再保存在系统文件夹。不过作为一种尝试,不妨去试着去实现这个功能。

9.2遇到的困难

动态生成图片,首先想到的就是使用System.Drawring相关的类,但在silverlight中并没有提供对System.Drawring的支持,网上查了一下,得到的答案是微软并没有打算在silverlight中提供对System.Drawring的支持。

另外,在silverlight中无法直接进行文件的保存操作。

这些困难都说明,要想在silverlight中直接生成图片并保存,目前是不可行的。

9.3解决方法

虽然我们不能直接在silverlight中生成图片保存,但我们的目的的生成图片,至于在什么地方生成图片,并没有固定的要求。我们知道,在asp.net中,我们经常使用System.Drawring相关类在动态生成图片,这个方法提醒我们,可以将生成图片的方法延迟到后台的服务中,然后访问后台生成的图片即可。用下面的图片来表示整个流程。

上面是一个理想的执行过程,但是在实际应用中发现有疑点问题,就是在生成图片后回调silverlight的函数中无法打开一个新的网页。只能把打开网页的代码放在按钮点击事件中,不过这对用户来说没有任何影响,只不过我们需要多做一点工作而已。在下面的代码中体现了这一点不同。

9.3.1 建立webservices文件

建立一个webservice文件,命名为createPic.asmx,在后台代码中根据传入的流程图xml描述文件动态生成图片。对应的框架代码如下:

Code
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Web;
usingSystem.Web.Services;
usingSystem.IO;
usingSystem.Reflection;

usingSystem.Drawing;
usingSystem.Drawing.Drawing2D;
usingSystem.Drawing.Text;


namespaceShareDesigner.Web
{
///<summary>
///SummarydescriptionforCreatePic
///</summary>
[WebService(Namespace="tempuri.org/")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
//ToallowthisWebServicetobecalledfromscript,usingASP.NETAJAX,uncommentthefollowingline.
//[System.Web.Script.Services.ScriptService]
publicclassCreatePic:System.Web.Services.WebService
{

publicclassRulePicture
{
publicvoidDrawingPic(Graphicsgr){}
}
publicclassActivityPicture
{
publicvoidDrawingPic(Graphicsgr){}
}
publicclassContainerPicture
{
publicvoidParseWorkFlowXML(stringxmlString)
{
}
int_width=400;
publicintWidth{get{return_width;}}
int_height=200;
publicintHeight{get{return_height;}}
List<RulePicture>_rulePictureCollection;
publicList<RulePicture>RulePictureCollection
{
get
{
if(_rulePictureCollection==null)
_rulePictureCollection=newList<RulePicture>();
return_rulePictureCollection;
}
}
List<ActivityPicture>_activityPictureCollection;
publicList<ActivityPicture>ActivityPictureCollection
{
get
{
if(_activityPictureCollection==null)
_activityPictureCollection=newList<ActivityPicture>();
return_activityPictureCollection;
}
}
}

[WebMethod]
publicvoidCreatePicture(stringpictureName,stringxml)
{

ContainerPicturecon=newContainerPicture();
con.ParseWorkFlowXML(xml);

Bitmappg=newBitmap(con.Width,con.Height);


Graphicsgr=Graphics.FromImage(pg);


for(inti=0;i<con.RulePictureCollection.Count;i++)
{
con.RulePictureCollection[i].DrawingPic(gr);
}
for(inti=0;i<con.ActivityPictureCollection.Count;i++)
{
con.ActivityPictureCollection[i].DrawingPic(gr);
}



Fontfn=newFont("@宋体",12);
SolidBrushsolidBlack=newSolidBrush(Color.Red);
gr.DrawString(pictureName,fn,solidBlack,(int)(pg.Width*0.1),(int)(pg.Height*0.1));


MemoryStreamstream=newMemoryStream();
pg.Save(Server.MapPath("~/picture/"+pictureName+".png"),System.Drawing.Imaging.ImageFormat.Png);


}
}
}

9.3.2 添加webservice引用

具体方法请参考kb.cnblogs.com/page/42888/?page=1

在流程容器页面Container.xaml添加一个按钮,在按钮事件中编写访问生成图片的代码,同时开发一个页面浏览生成的图片,代码如下所示,请注意其中的注释内容,另外,如果我们将项目部署到服务器上给客户用,那么需要修改动态设定服务路径,在下面的代码中有所体现。

Code
stringpicName="";
//连接创建图片服务,打开新的窗口访问图片
privatevoidbtnCreatePicture_Click(objectsender,RoutedEventArgse)
{
picName=Guid.NewGuid().ToString();

System.ServiceModel.BasicHttpBindingbind=newSystem.ServiceModel.BasicHttpBinding();
System.ServiceModel.EndpointAddressendpoint=newSystem.ServiceModel.EndpointAddress(
newUri(System.Windows.Browser.HtmlPage.Document.DocumentUri,"createpic.asmx"),null);
CreatePicture.CreatePicSoapClientclient=newShareidea.Web.UI.Control.Workflow.Designer.CreatePicture.CreatePicSoapClient(bind,endpoint);

client.CreatePictureCompleted+=newEventHandler<System.ComponentModel.AsyncCompletedEventArgs>(client_CreatePictureCompleted);
client.CreatePictureAsync(picName,ToXmlString());

Uriurl=newUri(System.Windows.Browser.HtmlPage.Document.DocumentUri,"picture.aspx?name="+picName);
System.Windows.Browser.HtmlPage.PopupWindow(url,"_blank",null);

}

voidclient_CreatePictureCompleted(objectsender,System.ComponentModel.AsyncCompletedEventArgse)
{
//下面这段代码无法弹出新的窗口,只能上面的方法中才能执行

//Uriurl=newUri(System.Windows.Browser.HtmlPage.Document.DocumentUri,"picture.aspx?name="+picName);
//System.Windows.Browser.HtmlPage.PopupWindow(url,"_blank",null);

}

9.3.3 建立图片显示页面

建立一个picture.aspx。这个文件接受一个参数pictureName,接受上一部的文件名称。根据参数检查是否存在这样的文件,如果存在,则将内容发送到客户端,如果不存在,那么显示一个错误消息,代入如下所示:

Code
protectedvoidPage_Load(objectsender,EventArgse)
{
stringfileName="";
if(Page.Request.QueryString["name"]!=null)
fileName=Page.Request.QueryString["name"].ToString();

stringfilePath=Server.MapPath("~/picture/"+fileName+".png");
FileInfoinfo=null;
longsize=0;
info=newFileInfo(filePath);
intseconds=0;
while(!info.Exists&&seconds<5)
{
info=newFileInfo(filePath);
System.Threading.Thread.Sleep(1000);
seconds++;
}
if(info.Exists)
{
size=info.Length;

Response.ClearContent();
Response.ContentType="image/png";
Response.WriteFile(filePath,0,size);
Response.End();
}
Response.Write("您请求的图片不存在!");

}

到现在为止,一个动态生成流程图图片的框架就完成了,因为还没有编写具体的活动和规则的图片生成方法,所以只是生成一个显示文件名称的图片。下一章将具体完成生成图片的代码。

========================================================

比sharepoint更强大的表单功能,图形化的流程设计,与asp.net完美结合,支持vs.net编程扩展

========================================================

本文共计1690个文字,预计阅读时间需要7分钟。

如何利用Silverlight开发动态流程图下载工具?

首先祝福一下,源代码在CodePlex上下载量超过1000%,此外还有许多演示程序放在微软免费的Silverlight Host上,您也可以申请免费空间。地址在http://silverlight.live.com/,技术支持QQ群:85444465,源代码。

首先庆祝一下源代码在codeplex上下载量超过1000

另外本演示程序放在微软免费的silverlight host上面,您也可以申请免费的空间。

地址在silverlight.live.com/

技术支持QQ群:85444465

源代码下载:www.shareidea.net/opensource.htm

在线演示:www.shareidea.net/workflow.htm

如何利用Silverlight开发动态流程图下载工具?

视频教程: www.shareidea.net/video/sharedesigner/sharedesigner.html

本文系列索引:

使用silverlight构建一个工作流设计器(一)

使用silverlight构建一个工作流设计器(二)

使用silverlight构建一个工作流设计器(三)

使用silverlight构建一个工作流设计器(四)

使用silverlight构建一个工作流设计器(五)

使用silverlight构建一个工作流设计器(六)

使用silverlight构建一个工作流设计器(七)

使用silverlight构建一个工作流设计器(八)

使用silverlight构建一个工作流设计器(九)

使用silverlight构建一个工作流设计器(十)

使用silverlight构建一个工作流设计器(十一)

使用silverlight构建一个工作流设计器(十二)

使用silverlight构建一个工作流设计器(十三)

9.1问题描述

今天有网友问,这个工作流设计器能不能生成对应的图片呢?我想不出生成图片能有什么作用,如果想用图片,我们大可以使用拷屏的方法保存到画图中,然后再保存在系统文件夹。不过作为一种尝试,不妨去试着去实现这个功能。

9.2遇到的困难

动态生成图片,首先想到的就是使用System.Drawring相关的类,但在silverlight中并没有提供对System.Drawring的支持,网上查了一下,得到的答案是微软并没有打算在silverlight中提供对System.Drawring的支持。

另外,在silverlight中无法直接进行文件的保存操作。

这些困难都说明,要想在silverlight中直接生成图片并保存,目前是不可行的。

9.3解决方法

虽然我们不能直接在silverlight中生成图片保存,但我们的目的的生成图片,至于在什么地方生成图片,并没有固定的要求。我们知道,在asp.net中,我们经常使用System.Drawring相关类在动态生成图片,这个方法提醒我们,可以将生成图片的方法延迟到后台的服务中,然后访问后台生成的图片即可。用下面的图片来表示整个流程。

上面是一个理想的执行过程,但是在实际应用中发现有疑点问题,就是在生成图片后回调silverlight的函数中无法打开一个新的网页。只能把打开网页的代码放在按钮点击事件中,不过这对用户来说没有任何影响,只不过我们需要多做一点工作而已。在下面的代码中体现了这一点不同。

9.3.1 建立webservices文件

建立一个webservice文件,命名为createPic.asmx,在后台代码中根据传入的流程图xml描述文件动态生成图片。对应的框架代码如下:

Code
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Web;
usingSystem.Web.Services;
usingSystem.IO;
usingSystem.Reflection;

usingSystem.Drawing;
usingSystem.Drawing.Drawing2D;
usingSystem.Drawing.Text;


namespaceShareDesigner.Web
{
///<summary>
///SummarydescriptionforCreatePic
///</summary>
[WebService(Namespace="tempuri.org/")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
//ToallowthisWebServicetobecalledfromscript,usingASP.NETAJAX,uncommentthefollowingline.
//[System.Web.Script.Services.ScriptService]
publicclassCreatePic:System.Web.Services.WebService
{

publicclassRulePicture
{
publicvoidDrawingPic(Graphicsgr){}
}
publicclassActivityPicture
{
publicvoidDrawingPic(Graphicsgr){}
}
publicclassContainerPicture
{
publicvoidParseWorkFlowXML(stringxmlString)
{
}
int_width=400;
publicintWidth{get{return_width;}}
int_height=200;
publicintHeight{get{return_height;}}
List<RulePicture>_rulePictureCollection;
publicList<RulePicture>RulePictureCollection
{
get
{
if(_rulePictureCollection==null)
_rulePictureCollection=newList<RulePicture>();
return_rulePictureCollection;
}
}
List<ActivityPicture>_activityPictureCollection;
publicList<ActivityPicture>ActivityPictureCollection
{
get
{
if(_activityPictureCollection==null)
_activityPictureCollection=newList<ActivityPicture>();
return_activityPictureCollection;
}
}
}

[WebMethod]
publicvoidCreatePicture(stringpictureName,stringxml)
{

ContainerPicturecon=newContainerPicture();
con.ParseWorkFlowXML(xml);

Bitmappg=newBitmap(con.Width,con.Height);


Graphicsgr=Graphics.FromImage(pg);


for(inti=0;i<con.RulePictureCollection.Count;i++)
{
con.RulePictureCollection[i].DrawingPic(gr);
}
for(inti=0;i<con.ActivityPictureCollection.Count;i++)
{
con.ActivityPictureCollection[i].DrawingPic(gr);
}



Fontfn=newFont("@宋体",12);
SolidBrushsolidBlack=newSolidBrush(Color.Red);
gr.DrawString(pictureName,fn,solidBlack,(int)(pg.Width*0.1),(int)(pg.Height*0.1));


MemoryStreamstream=newMemoryStream();
pg.Save(Server.MapPath("~/picture/"+pictureName+".png"),System.Drawing.Imaging.ImageFormat.Png);


}
}
}

9.3.2 添加webservice引用

具体方法请参考kb.cnblogs.com/page/42888/?page=1

在流程容器页面Container.xaml添加一个按钮,在按钮事件中编写访问生成图片的代码,同时开发一个页面浏览生成的图片,代码如下所示,请注意其中的注释内容,另外,如果我们将项目部署到服务器上给客户用,那么需要修改动态设定服务路径,在下面的代码中有所体现。

Code
stringpicName="";
//连接创建图片服务,打开新的窗口访问图片
privatevoidbtnCreatePicture_Click(objectsender,RoutedEventArgse)
{
picName=Guid.NewGuid().ToString();

System.ServiceModel.BasicHttpBindingbind=newSystem.ServiceModel.BasicHttpBinding();
System.ServiceModel.EndpointAddressendpoint=newSystem.ServiceModel.EndpointAddress(
newUri(System.Windows.Browser.HtmlPage.Document.DocumentUri,"createpic.asmx"),null);
CreatePicture.CreatePicSoapClientclient=newShareidea.Web.UI.Control.Workflow.Designer.CreatePicture.CreatePicSoapClient(bind,endpoint);

client.CreatePictureCompleted+=newEventHandler<System.ComponentModel.AsyncCompletedEventArgs>(client_CreatePictureCompleted);
client.CreatePictureAsync(picName,ToXmlString());

Uriurl=newUri(System.Windows.Browser.HtmlPage.Document.DocumentUri,"picture.aspx?name="+picName);
System.Windows.Browser.HtmlPage.PopupWindow(url,"_blank",null);

}

voidclient_CreatePictureCompleted(objectsender,System.ComponentModel.AsyncCompletedEventArgse)
{
//下面这段代码无法弹出新的窗口,只能上面的方法中才能执行

//Uriurl=newUri(System.Windows.Browser.HtmlPage.Document.DocumentUri,"picture.aspx?name="+picName);
//System.Windows.Browser.HtmlPage.PopupWindow(url,"_blank",null);

}

9.3.3 建立图片显示页面

建立一个picture.aspx。这个文件接受一个参数pictureName,接受上一部的文件名称。根据参数检查是否存在这样的文件,如果存在,则将内容发送到客户端,如果不存在,那么显示一个错误消息,代入如下所示:

Code
protectedvoidPage_Load(objectsender,EventArgse)
{
stringfileName="";
if(Page.Request.QueryString["name"]!=null)
fileName=Page.Request.QueryString["name"].ToString();

stringfilePath=Server.MapPath("~/picture/"+fileName+".png");
FileInfoinfo=null;
longsize=0;
info=newFileInfo(filePath);
intseconds=0;
while(!info.Exists&&seconds<5)
{
info=newFileInfo(filePath);
System.Threading.Thread.Sleep(1000);
seconds++;
}
if(info.Exists)
{
size=info.Length;

Response.ClearContent();
Response.ContentType="image/png";
Response.WriteFile(filePath,0,size);
Response.End();
}
Response.Write("您请求的图片不存在!");

}

到现在为止,一个动态生成流程图图片的框架就完成了,因为还没有编写具体的活动和规则的图片生成方法,所以只是生成一个显示文件名称的图片。下一章将具体完成生成图片的代码。

========================================================

比sharepoint更强大的表单功能,图形化的流程设计,与asp.net完美结合,支持vs.net编程扩展

========================================================