以编程方式启动sketchflow播放器

时间:2010-11-26 20:49:16

标签: silverlight sketchflow

我正在尝试在PRISM区域中嵌入SketchFlow原型,我成功地使草图流播放器可视化渲染,但看起来没有加载Sketch.Flow数据。我在NavigationViewModel上看到了许多绑定异常。

我知道它可能不受官方支持,但我想在单个Silverlight应用程序中托管多个sketchflow,这样我就可以轻松部署新的SketchFlow XAP并显示我选择的任何一个。

2 个答案:

答案 0 :(得分:0)

您的问题中提供的信息不足以确定,但我怀疑它与SketchFlow播放器如何找到Sketch.Flow数据文件有关。

如果您查看常规SketchFlow项目的结构,您将拥有一个主应用程序,以及一个包含项目屏幕的第二个程序集。在主应用程序的app.xaml.cs文件中,有一行如下所示:

[assembly:Microsoft.Expression.Prototyping.Services.SketchFlowLibraries(“SilverlightPrototype1.Screens”)]

该行定义了SketchFlow播放器查找所需数据的位置。我还没有尝试过你正在做的事情,但是可能需要在你的主要设备或承载SketchFlow播放器的加载程序集上设置该属性。

请注意,这不是官方支持,我只是想帮助您找到解决方案。

答案 1 :(得分:0)

第一步是构建PlayerWindow的实例。

string targetTypeName = "Microsoft.Expression.Prototyping.Workspace.PlayerWindow, Microsoft.Expression.Prototyping.Runtime, Version=4.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; var targetType = Type.GetType(targetTypeName); var view = container.Resolve(targetType) as PlayerWindow;

仅仅构建一个PlayerWindow是不够的。播放器窗口中包含代码,不幸的是使用CallingAssembly来定位Sketch.Flow内容并对其进行反序列化。下面我修改了我在Microsoft PlayerWindow类中找到的代码,以便使用指定的程序集而不是来自CallingAssembly的程序集。

string str = string.Format(CultureInfo.InvariantCulture, "/SilverlightPrototype1.Screens;Component/Sketch.Flow", new object[] { PlayerContext.Instance.LibraryName }); StreamResourceInfo resourceStream = Application.GetResourceStream(new Uri(str, UriKind.RelativeOrAbsolute)); if (resourceStream != null) { data = Serializer.Deserialize(resourceStream.Stream); }

一旦我得到反序列化的Sketch.Flow内容,我想我需要使用该数据和其他视图模型,MiniFlowGraphViewModel,AnnotationViewModel,BrandingModel重新初始化PlayerWindow的NavigationViewModel,以及更新DesignTimeAnnotations。

PlayerContext.Instance.RuntimeData = data;
view.NavigationViewModel = new NavigationViewModel(data);
view.MiniFlowGraphViewModel = new FlowGraphViewModel();
view.AnnotationViewModel = new AnnotationViewModel(view.NavigationViewModel, data.RuntimeOptions.DisableInking, data.RuntimeOptions.HideDesignTimeAnnotations);
view.BrandingModel = new BrandingModel(data);
PlayerContext.Instance.BrandingModel = new BrandingModel(data);

不幸的是,似乎PLayerWindow上的DesignTimeAnnotations属性是内部的还是私有的,所以我不确定如何更新它。

执行上述操作后,我会在区域内找到一个SketchFlow播放器,导航显示屏显示我当前正在“屏幕1”上。但是,主屏幕显示区域为空白,左侧控制面板不工作。我在NavigationViewModel,BrandinModel和FlowGraphModel上遇到了各种BindingExpression错误。

  • 缩放
  • DockedControls
  • CollapsedControls
  • SharedInkStrokes
  • InkVisibility
  • InkEditingMode
  • IsInkEditModeNone
  • IsMapOpen
  • IsFlowOverviewOpen