共享目标通用应用程序Windows 10方法

本文关键字:Windows 10方法 应用程序 目标 共享 | 更新日期: 2023-09-27 18:11:33

我苦苦挣扎了几个小时,找不到有效的解决方案。我的应用程序是共享的目标应用程序,问题是当它运行时,用户想要共享内容。

 protected override async void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
        {
           await OnInitializeAsync();
            if (await CheckToken(args) != true) return;
            if (args.PreviousExecutionState != ApplicationExecutionState.Running)
            {
                if (await LoadData(args) != true) return;
            }
            var frame = new Frame();
            var navigationService = new NavigationService(_dispatcherService) { RootFrame = frame, };
            Window.Current.Content = frame;
            Window.Current.Activate();
            navigationService.Navigate<ShareViewModel>(args.ShareOperation);
        }

问题是,我不能使用帧从运行的应用程序,因为我得到一个异常"编组线程....",所以我创建一个新的帧,我分配给windows . current . content。这工作得很好,但问题是当用户完成共享。我该怎么办?似乎我应该将前一帧分配给windows . current . content,这是通过共享目标"覆盖"的,对吧?当我尝试这样做时,我再次得到"编组线程"异常。如果我不这样做,我就不能与应用交互因为我得到一个异常,应用被关闭了。成为共享目标的合适场景是什么?

编辑:我想重要的是要提到,我调用ReportStarted()当我发送消息在ShareViewModel和ReportCompleted()当我完成。

当我尝试分配帧返回时抛出异常:{"应用程序调用了为不同线程编组的接口。'r'n'r'n初始化应用程序的根目录失败"}

共享目标通用应用程序Windows 10方法

我正在粘贴解决问题的解决方案。我认为这里的关键是使用

CoreWindow.GetForCurrentThread () .Dispatcher

 protected override async void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
        {
            await OnInitializeAsync();
            if (await CheckToken(args) != true) return;
            if (args.PreviousExecutionState != ApplicationExecutionState.Running)
            {
                if (await LoadData(args) != true) return;
            }
            var frame = new Frame();
            Window.Current.Content = frame;
            var dispatchService = new DispatcherService() { Dispatcher = CoreWindow.GetForCurrentThread().Dispatcher };
            var navigationService = new NavigationService(dispatchService) { RootFrame = frame };
            navigationService.Navigate<ShareViewModel>(args.ShareOperation);
            Window.Current.Activate();
        }