SharePoint 2010整合Silverlight 4应用 - 任务管理

SharePoint 2010可以与Silverlight实现紧密集成。不管是在浏览器中运行的Silverlight程序还是单独的一个Silverlight程序,都能与SharePoint 2010实现很好的整合。本文中我们将实现一个Silverlight和SharePoint高度整合的例子,通过SharePoint 2010客户端对象模型访问SharePoint任务列表。同时,我们还将学习如何通过SharePoint自带的Silverlight Web部件来宿主Silverlight应用。下图是根据我个人的理解绘制的Silverlight和SharePoint 2010应用整合示意图。

2010122213005386.png

从上图我们可以看到,我们分别有SharePoint客户端对象模型(OM)和SharePoint Web服务两种API供 Silverlight应用程序调用。 事实上客户端对象模型和服务这两条途径,不仅仅能用在Silverlight中,还可以用于其它的客户端应用程序中。

在开始编写应用程序之前,我们首先了解一下Silverlight和SharePoint之间不同类型的集成模型。我们可以简单的通过HTML以IFrame的方式显示Silverlight应用程序,也可以将Silverlight应用程序宿主在Web部件中,还可以调用SharePoint对象模型或服务。这些方式彼此之间并没有硬性的分类界限。只是人为的通过使用规模所做的一个区分。 分类如下:

1. 无接触 :通过无接触方式,可以直接把现有的Silverlight应用集成到SharePoint。 目的只是在SharePoint中进行显示。直接使用iframe即可。

2010122213090745.png

2.低接触 :低接触的应用与SharePoint间的互动多了一点。但也仅仅是通过SharePoint 开箱即用的Silverlight Web部件对Silverlight应用进行装载而已。 这个应用程序本身是一个独立的应用程序,它可能会调用一些除SharePoint API以外的其他服务。

2010122213100574.png

之前我的一篇博文中,曾讨论过一个典型的低接触的例子。是关于SharePoint2010整合Silverlight 4应用——Bing地图控件

BingMap17.PNG

3.高接触:高接触整合是指利用到SharePoint客户端对象模型或Web服务来读写SharePoint Server信息的应用整合。 应用程序本身可以是一个WPF应用程序,或者是像Silverlight这样的客户端应用程序,或者是ASP.NET 、JavaScript应用程序。下图为一个Silverlight客户端应用程序的高接触整合。

 

2010122213005386.png

接下来,我们要实现一个Silverlight与SharePoint高接触的应用,通过Silverlight调用客户端对象模型。会对使用客户端对象模型的三种场景都进行描述:

1. 在浏览器中运行的Silverlight应用程序

2. 在浏览器外运行的(Out of Browser,简称OOB)Silverlight应用程序

3. 作为Silverlight XAP文件宿主在SharePoint Web部件中的Silverlight应用程序

首先,我们需要创建一个Silverlight应用程序, 打开Visual Studio 2010>“新建” >“项目” 。 选择Silverlight项目模板,并选择.NET Framework 4.0。将该项目命名为“SilverlightSPIntegration”。

2010122213593546.png

点击“确定”按钮后,会弹一个窗口要求自动创建一个Web应用程序,Silverlight应用程序将自动宿主在该Web应用程序中 。

2010122214001045.png

下一步我们要做的就是编写Silverlight程序来调用客户端对象模型的API 。 右击Silverlight解决方案,选择“添加引用”

2010122218115432.png

这里我们需要添加“Microsoft.SharePoint.Client.Silverlight.dll”和“Microsoft.SharePoint.Client.Silverlight.Runtime.dll”这两个dll。他们位于"C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\ClientBin"文件夹下。

2010122218123731.png

引用添加完成后,整个Silverlight应用程序的文件夹结构如下:

2010122218125148.png

接下来,我们要对Silverlight的XAML进行设计,实现SharePoint网站中的某些功能。如上所述,在本例中,我们会从SharePoint内置的任务列表中读取一些数据  。因此,我们不妨先参考一下SharePoint默认的界面。打开SharePoint网站,从快速启动区中找到“任务”列表并点击它。

2010122218135884.png

这是默认的SharePoint任务列表。 当然你也可以使用任意的列表,甚至是自定义列表。 只需要根据实际的设计修改对应的用户界面和代码即可。现在,为该任务列表输入一些虚拟的数据。

2010122218144388.png

下面是我为的任务列表添加的一些虚拟数据。

2010122218192363.png

至此,我们完成了SharePoint部分的工作。 接下来我们要创建一个自定义的UI,用Silverlight来显示这些数据。 界面比较简陋,只是为了说明两者是如何实现整合的。

返回Visual Studio,在Silverlight解决方案中,设计一些简单的XAML界面。

2010122218195270.png

为了快速设置样式,我用Expression Blend对界面做了一点美化工作。

2010122218202892.png

保存该Expression Blend项目,并在Visual Studio中从我们的Silverlight应用程序中打开。它会要求重新加载应用程序,因为内容在当前环境外被修改了。

2010122218173133.png

以下是Silverlight用户界面的XAML代码

<!--
    <Setter Property="MinWidth" Value="150" />
    <Setter Property="MaxWidth" Value="150" />
    <Setter Property="HorizontalAlignment" Value="Left" />
-->
<!--
    <Setter Property="HorizontalAlignment" Value="Right" />
    <Setter Property="Foreground" Value="Orange" />
-->

现在,我们 完成了界面设计。 可以按“F5”运行一下,看看用户界面的样子。

2010122218225882.png

上图就是我们设计的Silverlight应用程序。它托管在ASP.NET Web应用程序里。 现在就可以使用 SharePoint 客户端对象模型来从SharePoint服务器中读取任务列表数据了。

因为我们要通过类来读取列表的信息,所以首先要创建一个任务类型的类,作为任务的容器。下面是任务类代码。 

 

public class Tasks
{
        public string Title { get; set; }
        public string DueDate { get; set; }
        public string Status { get; set; }
        public string Priority { get; set; }
        public double PercentComplete { get; set; }
}

打开MainPage.XAML.CS文件,添加如下的命名空间

using Microsoft.SharePoint.Client;

添加好命名空间后就可以调用对象模型API了。

下面的示例代码可以从特定的SharePoint站点中获取某列表实例。

 

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            using (ClientContext SharePointContext = new ClientContext(this.SPWebSiteURL))
            {
                this.query = new CamlQuery();
                SharePointContext.Load(SharePointContext.Web);
                this.task = SharePointContext.Web.Lists.GetByTitle("Tasks");
                this.strQuery = @" ";
                query.ViewXml = this.strQuery;
                this.taskLists = this.task.GetItems(this.query);
                SharePointContext.Load(this.taskLists);
                SharePointContext.ExecuteQueryAsync(this.OnSiteLoadSuccess, this.OnSiteLoadFailure);
            }
        }

SharePointContext.ExecuteQueryAsync方法的执行是异步的。 该方法使用两个回调函数分别处理成功和失败的返回结果。

 

2010122218273417.png

如上面的代码所示,如果我们的程序成功执行,它会调用OnSiteLoadSuccess,否则调用 OnSiteLoadFailure。下面是这两个函数实现代码。

 

private void OnSiteLoadSuccess(object sender, ClientRequestSucceededEventArgs e)
{
    foreach (ListItem item in this.taskLists)
    {
       Tasks objTask = new Tasks();
       objTask.Title = item["Title"].ToString();
       objTask.DueDate = item["DueDate"].ToString();
       objTask.Status = item["Status"].ToString();
       objTask.Priority = item["Priority"].ToString();
       double fraction = Convert.ToDouble(item["PercentComplete"]);
       objTask.PercentComplete = fraction * 100;
       this.SharePointTasks.Add(objTask);
    }
   AddTaskList( this.SharePointTasks);
}

private void OnSiteLoadFailure(object sender, ClientRequestFailedEventArgs e)
{
    MessageBox.Show(e.Message +  e.StackTrace);
}

接下来,我们需要创建一个委托来更新UI。使用Dispatcher.BeginInvoke ,以避免跨线程调用的异常。

private void AddTaskList()
{
    this.Dispatcher.BeginInvoke(new UpdateSilverLightUI(this.AddItemsToLists), this.SharePointTasks);
}
private void AddItemsToLists(List tasks)
{
    foreach (Tasks t in tasks)
    {
        TaskList.Items.Add(t.Title);
    }
}

现在,所有的任务已被添加到Silverlight的Task List中,然后我们要处理的ListBox的SelectionChanged事件,并在不同的文本框中显示相应的值。

 

private void TaskList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var v = this.SharePointTasks.FirstOrDefault(item => item.Title.Equals(TaskList.SelectedItem.ToString()));
    if (v != null)
    {
        txtTitle.Text = v.Title;
        txtDueDate.Text = v.DueDate;
        txtPriority.Text = v.Priority;
        txtStatus.Text = v.Status;
        txtPercentage.Value = v.PercentComplete;
    }
}
 
 

OK,到这里所有的代码编写部分就完成了。但如果你现在尝试运行该应用程序,会得到一个跨域访问异常。因为SharePoint网站宿主在IIS中,而正在运行的应用程序却是在VS里。为了解决这个问题,你必须把clientAccessPolicy.xml文件放到SharePoint站点的根目录。
按F5运行该应用程序。没错,所显示的Silverlight风格的任务列表和前面我们创建的SharePoint列表完全一致。可以点击List中的一个任务来显示详细信息。

2010122218303282.png

至此,我们完成了一个在单独的网站中运行的Silverlight应用,并与SharePoint集成。你可以把这个应用宿主在任何ASP.NET Web应用程序中 。

接下来,让我们把这个Silverlight应用程序变得更有趣些,使其可以在浏览器外运行。事实上仅仅是通过VS2010自带的配置工具做一个小小的修改就OK了。

在解决方案管理器中右键点击Silverlight应用程序 >“属性”,然后勾选“允许在浏览器外运行应用程序” 复选框,如下图所示。

2010122218313834.png

点击“浏览器外设置...”可以做更细的配置 您可以修改窗口 的高度,宽度和标题等。

2010122218321933.png

完成浏览器外设置后,再运行该应用程序,你会发现它现在和Windows应用程序运行效果很相似.

2010122218325662.png

我们已经实现了在浏览器中和在浏览器外的Silverlight应用与SharePoint 集成。

如何将Silverlight应用作为一个SharePoint Web部件宿主在SharePoint中呢。 其实和在一般网站中一样,SharePoint也是通过Silverlight的XAP文件实现宿主的,之前我已经在上次讲地图控件的时候提到过。

首先,我们在与上面的例子相同的解决方案下,新建一个SharePoint 2010项目。选择“ 空白SharePoint项目 ”模板。

2010122218335957.png

为项目命名,然后单击“ 确定 ”。接下来将显示如下的部署向导。

2010122218351180.png

要求输入作为调试的SharePoint网站的位置和部署类型。 你可以使用默认的选择。 点击“ 确定 ”, 完成对SharePoint项目的创建。

现在,我们需要添加一个SharePoint项——模块。 模块包含一个待部署的文件,本身需要包含在一个SharePoint项目中。 要添加一个模块,可以在SharePoint项目上右击,并点击添加新项。

2010122218354124.png

在SharePoint 2010分类下,选择“模块”,为其命名,点击“ 添加 ”。 然后右击该模块, 点击“ 属性 ”。

2010122218360917.png

在属性窗口的“ 项目输出引用 ”选择器中,做如下图的设置。

2010122218373795.png

请注意,你需要选择部署类型为“ElementFile”,项目名称应该是Silverlight解决方案的名称 。点击确定 。这是SharePoint模块的“Element.XML”文件中,会添加到Silverlight的xap文件的路径。通过这种方式可以把Silverlight应用添加到SharePoint网站中,使其成为SharePoint的一部分。

完成我们的SharePoint项目后,就可以编译部署了。 右键单击SharePoint项目,选择部署。这样就完成了部署操作。

2010122218383270.png

接下来,我们将其宿主到SharePoint网站的Silverlight Web部件。

Silverlight Web部件和其他Web部件的使用一样。首先你需要打开SharePoint页面的编辑模式,转到插入,选择Web部件。 选择“ 媒体与内容 ”类别,选择SharePoint 自带的Silverlight Web部件。 点击添加 。

2010122218390517.png

你会看到一个Ajax弹出对话框,要求输入Silverlight 应用程序包(XAP 文件的URL这里填写上面我们在SharePoint模块的Element. XML文件中指定的URL。 

2010122218394883.png

点击确定。运行成功的话,Silverlight Web部件的显示如下图所示。

2010122218404031.png

如果没有写对URL,保存后会看到如下的错误信息。 提示你可能提供的XAP文件路径有错误,请重新配置。

2010122218413284.png

这时,你必须首先确保你提供的XAP文件路径是有效的。 如果路径有效,再检查一下相应的功能是否已经被激活(可以从网站操作>网站设置中找到管理功能的链接)。

如果愿意,我们可以把SharePoint的任务列表和 Silverlight WebPart放在一个页面上。

2010122218421860.png

 

这样当我们在任务列表中添加一项新的任务后,新任务同时会反映在我们的Silverlight任务控件中。

如果不想这么麻烦的部署一个XAP文件,也可以简单的把XAP上传到一个文档库中。然后在Web部件中直接指定其在文档库中的路径即可。

2010122218430355.png

2010122218431453.png

当然,你还可以创建一个SharePoint 2010项目,包含一个自定义Web部件宿主Silverlight应用,然后再部署该Web部件。

 

希望对你有帮助!

 

参考资料

Silverlight Task Control For SharePoint 2010 - Example of Hight Touch Integration



Microsoft Silverlight 4 Tools for Visual Studio 2010

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值