Способ обновления пользовательского интерфейса приложения UWP из проекта компонента среды выполнения UWP

Можем ли мы обновить текст UWP TextBlock из AppService?

Здесь у меня есть служба приложения в другом проекте компонента среды выполнения UWP, которая добавлена ​​в качестве ссылки на проект пользовательского интерфейса.

Так что у меня нет прямой связи с UI. Но мне нужно обновить пользовательский интерфейс, если приложение работает как активное.

Примечание. Вместо этого мы можем показывать тосты и живую плитку. Но хочу знать возможность напрямую обновлять пользовательский интерфейс.

Отредактировано: [18.03.18]

Я пытаюсь объединить существующее приложение WPF в UWP с помощью DesktopBridge. Здесь мне нужно иметь двустороннюю связь между обоими приложениями.

Таким образом, были созданы два AppServices отдельно в WPF и UWP для отправки и получения данных в форме ValueSet и на основе запрошенных данных необходимо обновить пользовательский интерфейс.

Для приложения WPF с пользовательским интерфейсом и AppService в одном проекте. Для приложения UWP отделил AppServices как проект компонента среды выполнения (Out-Of-Proc). В этом случае оба AppServices работают нормально во время выполнения, но не могут обновить пользовательский интерфейс UWP (но могут обновить пользовательский интерфейс WPF).

Также я пытался использовать внутрипроцессные службы, в этом случае оба AppServices работают нормально, но я не могу установить соединение от UWP к WPF. Поэтому я не могу отправить запрос из UWP (WPF to UWP работает).

Так что это моя настоящая проблема. Хотите знать, правильно ли я поступаю? И есть ли способ исправить или другой лучший способ сделать это.

Далее следует код .appmanifest.

Как услуга In-Proc

<Extensions>
    <uap:Extension Category="windows.appService">
        <uap:AppService Name="com.mycompany.scanner.uwpappservice" />
    </uap:Extension>
    <uap:Extension Category="windows.appService">
        <uap:AppService Name="com.mycompany.scanner.wpfappservice" />
    </uap:Extension>
    <desktop:Extension Category="windows.fullTrustProcess" Executable="Scanner.WPF.exe" />
</Extensions>

Как услуга вне производства

<Extensions>
    <uap:Extension Category="windows.appService" EntryPoint="UWPApp.AppServiceLibrary.UWPAppService">
        <uap:AppService Name="com.mycompany.scanner.uwpappservice" />
    </uap:Extension>
    <uap:Extension Category="windows.appService">
        <uap:AppService Name="com.mycompany.scanner.wpfappservice" />
    </uap:Extension>
    <desktop:Extension Category="windows.fullTrustProcess" Executable="Scanner.WPF.exe" />
</Extensions>

person Ramanan    schedule 16.03.2018    source источник


Ответы (2)


Вы можете использовать внутрипроцессную службу приложений, как описано в документация.

Службы приложений теперь могут работать в том же процессе, что и приложение переднего плана, что значительно упрощает взаимодействие между приложениями и устраняет необходимость выделять код службы в отдельный проект.

Это означает, что вам даже не нужно переносить код в отдельный компонент среды выполнения Windows, и вы можете взаимодействовать с пользовательским интерфейсом, если он активен, через Window.Current. Однако вам нужно не забыть убедиться, что ваш код, управляющий пользовательским интерфейсом, выполняется в потоке пользовательского интерфейса с использованием Dispatcher.

person Martin Zikmund    schedule 16.03.2018
comment
Привет, Мартин, я добавил больше баллов по своей проблеме, пожалуйста, проверьте. Благодарю. - person Ramanan; 18.03.2018

Если вы настроили службу AppService для работы в процессе с приложением переднего плана, вы можете обновить пользовательский интерфейс напрямую. Если AppService работает вне процесса, вам нужно будет отправить запрос в приложение переднего плана, чтобы обновить его пользовательский интерфейс от вашего имени, или перейти с всплывающими уведомлениями / плитками.

Вот некоторая информация о том, как заставить ваш AppService работать в процессе с процессом приложения: https://docs.microsoft.com/en-us/windows/uwp/launch-resume/convert-app-service-in-process

Что касается отредактированного вопроса, типичный шаблон для использования следующий: когда приложение WPF запускается, откройте соединение службы приложения с UWP. Теперь с обеих сторон сохраните ссылку на соответствующий экземпляр объекта AppServiceConnection. Таким образом, вы можете осуществлять двустороннюю связь, и любая из сторон (UWP и WPF) может установить запрос на другую сторону.

person Stefan Wick MSFT    schedule 16.03.2018
comment
Привет, Стефан, я добавил больше баллов по своей проблеме, пожалуйста, проверьте. Благодарю. - person Ramanan; 18.03.2018