2017-02-21 9 views
0

У меня есть приложение UWP, которое открывает окно проекции (similar to the sample app). Теперь я хочу реагировать на RotationChanged -Event в обоих окнах, независимо от того, какое окно активно.UWP: Одновременно управляйте двумя окнами с RadialController

Могу ли я как-то поделиться экземпляром для RadialController? Или мне нужно управлять им в одном представлении и вручную передать событие второму?

Обновленный вопрос: Как использовать тот же экземпляр ViewModel в обоих окнах?

P.s: Я думаю, что добавление RadialController и/или Surface-Dial в качестве тегов может иметь смысл.

ответ

0

К сожалению, это не так просто, как используя тот же ViewModel, что и указатель @IInspectable. Вот почему я отправил команду ко второму представлению на каждые Dial_RotationChanged. Не так красиво, как я бы надеялся, но пока работает хорошо.

код выглядит примерно так:

private async void Dial_RotationChanged(RadialController sender, 
             RadialControllerRotationChangedEventArgs args) 
{ 
    await ProjectionViewPageControl.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
    () => 
    { 
     var thePage = (DetailPage)((Frame)Window.Current.Content).Content; 
     thePage.ProjectionTest(args.RotationDeltaInDegrees); 
    }); 
} 
0

Использование UWP, я думаю, вы должны использовать шаблон MVVM.

Если вы используете шаблон MVVM, наличие нескольких элементов графического интерфейса (включая Windows) для одного изменения ViewModel было бы тривиальным. Итак, реальный вопрос: используете ли вы шаблон MVVM, другой шаблон или вообще не шаблон?

Если вам нужно узнать его первым, я написал кое-что о его отношении к WPF (UWP является Followup из WPF, с App-связанной бэкэнд вещи брошены в): https://social.msdn.microsoft.com/Forums/vstudio/en-US/b1a8bf14-4acd-4d77-9df8-bdb95b02dbe2/lets-talk-about-mvvm?forum=wpf

+0

Я не уверен, что это так просто. Когда 'CoreWindow' запускается на выделенных потоках, каждый из них и не является гибким, вам придется реализовать какой-то маршалинг. Если проекция языка C# уже реализует это маршалинг, ответственность за вас несут. Хотя я мог ошибаться. – IInspectable

+0

К счастью WPF/UWP были разработаны с нуля с помощью диспетчера и многопоточности: http://stackoverflow.com/questions/32671719/uwp-updating-ui-through-data-binding-from-a-background-thread Возможно, вам придется написать код привязки вручную, а затем использовать класс Binding, но это должно быть о нем. Это один из редких случаев, когда вам нужен код Viewside (так как это проблема с приставкой). Немного странно, что элемент GUI находится в альтернативном потоке (основной/исходный поток по умолчанию), но для рисования тяжелых вещей он определенно имеет смысл. – Christopher

+0

Во-первых, я использую MVVM. После вашего сообщения я пытался связать обе Windows с одной и той же ViewModel, но в итоге оказался с двумя отдельными экземплярами: -/Мне нужно отправить события вручную во второе окно с помощью диспетчера? – Thomas

Смежные вопросы