программно запустить Sketchflow Player

Я пытаюсь встроить прототип SketchFlow в область PRISM, мне удалось получить визуализацию проигрывателя sketchflow, но оказалось, что данные Sketch.Flow не загружены. Я вижу ряд исключений привязки в NavigationViewModel.

Я знаю, что он может не поддерживаться официально, но я хотел бы разместить несколько потоков эскизов в одном приложении Silverlight, чтобы я мог легко развертывать новые XAP-файлы SketchFlow и отображать тот, который я выберу.


person markti    schedule 26.11.2010    source источник


Ответы (2)


В вашем вопросе недостаточно информации, чтобы знать наверняка, но я подозреваю, что это связано с тем, как SketchFlow Player находит файл данных Sketch.Flow.

Если вы посмотрите, как структурирован обычный проект SketchFlow, у вас есть основное приложение и вторая сборка, содержащая экраны для проекта. В файле app.xaml.cs основного приложения есть строка, которая выглядит так:

[сборка: Microsoft.Expression.Prototyping.Services.SketchFlowLibraries ("SilverlightPrototype1.Screens")]

Эта строка определяет, где SketchFlow Player будет искать ожидаемые данные. Я не пробовал то, что вы делаете, но этот атрибут, вероятно, нужно будет установить на вашем основном сервере или загрузочной сборке, в которой размещен SketchFlow Player.

Обратите внимание, что это официально никак не поддерживается, я просто пытаюсь помочь вам найти решение.

person Chuck Hays    schedule 29.11.2010
comment
См. Мою попытку ответа ниже ... Я более подробно рассказываю о том, как я пытаюсь загрузить SketchFlow Player в регионе. Я думаю, что я довольно близок, но, вероятно, мне не хватает какой-то внутренней работы, которую выполняют ViewModels или PlayerContext. - person markti; 01.12.2010

Первый шаг - создать экземпляр 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, я думаю, мне нужно повторно инициализировать PlayerWindow NavigationViewModel, используя эти данные и другие модели представления, MiniFlowGraphViewModel, AnnotationViewModel, BrandingModel, а также обновить 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);

К сожалению, похоже, что свойство DesignTimeAnnotations в PLayerWindow является либо внутренним, либо частным, поэтому я не уверен, как его обновить.

Выполнение описанного выше даст мне SketchFlow Player внутри региона с навигационным дисплеем, показывающим, что я сейчас нахожусь на «Экране 1». Однако область отображения основного экрана пуста, а левые панели управления не работают. Я получаю множество ошибок BindingExpression в NavigationViewModel, BrandinModel и FlowGraphModel.

  • Увеличить
  • DockedControls
  • CollapsedControls
  • SharedInkStrokes
  • InkVisibility
  • InkEditingMode
  • IsInkEditModeNone
  • IsMapOpen
  • IsFlowOverviewOpen
person markti    schedule 30.11.2010