0

我正在尝试在 PRISM 区域中嵌入 SketchFlow 原型,我成功地让 SketchFlow 播放器视觉效果呈现,但似乎未加载 Sketch.Flow 数据。我在 NavigationViewModel 上看到了许多绑定异常。

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

4

2 回答 2

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 以及更新 DesignTimeAnnotations 重新初始化 PlayerWindow 的 NavigationViewModel。

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 错误。

  • 飞涨
  • 停靠控件
  • 折叠控件
  • SharedInkStrokes
  • 不可见性
  • 墨水编辑模式
  • IsInkEditModeNone
  • IsMapOpen
  • IsFlowOverviewOpen
于 2010-11-30T22:36:22.960 回答
0

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

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

[程序集:Microsoft.Expression.Prototyping.Services.SketchFlowLibraries("SilverlightPrototype1.Screens")]

该行定义了 SketchFlow Player 将在何处查找它所期望的数据。我还没有尝试过您在做什么,但可能需要在您的主设备或承载 SketchFlow 播放器的加载程序集上设置该属性。

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

于 2010-11-29T15:36:13.827 回答