我正在尝试在 PRISM 区域中嵌入 SketchFlow 原型,我成功地让 SketchFlow 播放器视觉效果呈现,但似乎未加载 Sketch.Flow 数据。我在 NavigationViewModel 上看到了许多绑定异常。
我知道它可能不受官方支持,但我想在单个 Silverlight 应用程序中托管多个草图流,以便我可以轻松部署新的 SketchFlow XAP 并显示我选择的任何一个。
我正在尝试在 PRISM 区域中嵌入 SketchFlow 原型,我成功地让 SketchFlow 播放器视觉效果呈现,但似乎未加载 Sketch.Flow 数据。我在 NavigationViewModel 上看到了许多绑定异常。
我知道它可能不受官方支持,但我想在单个 Silverlight 应用程序中托管多个草图流,以便我可以轻松部署新的 SketchFlow XAP 并显示我选择的任何一个。
第一步是构造 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 错误。
您的问题中没有提供足够的信息来确定,但我怀疑这与 SketchFlow 播放器如何找到 Sketch.Flow 数据文件有关。
如果您查看常规 SketchFlow 项目的结构,您会发现一个主应用程序和一个包含项目屏幕的第二个程序集。在主应用程序的 app.xaml.cs 文件中,有一行如下所示:
[程序集:Microsoft.Expression.Prototyping.Services.SketchFlowLibraries("SilverlightPrototype1.Screens")]
该行定义了 SketchFlow Player 将在何处查找它所期望的数据。我还没有尝试过您在做什么,但可能需要在您的主设备或承载 SketchFlow 播放器的加载程序集上设置该属性。
请注意,这没有任何官方支持,我只是想帮助您找到解决方案。