программно запустить SketchFlow Player - PullRequest
0 голосов
/ 26 ноября 2010

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

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

Ответы [ 2 ]

0 голосов
/ 01 декабря 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 я думаю, что мне нужно повторно инициализировать NavigationViewModel PlayerWindow, используя эти данные и другие модели представления, 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
0 голосов
/ 29 ноября 2010

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

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

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

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

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

...