Приложение Windows 8 запускается после публикации

Я ищу возможность запустить свое собственное приложение для Windows после того, как какой-то контент будет передан ему через панель чудо-кнопок. Я нашел этот пример MS https://code.msdn.microsoft.com/windowsapps/Sharing-Content-Target-App-e2689782/ Но после нажатия кнопки "Поделиться" приложение закрывается. Я попробовал этот код в методе нажатия кнопки:

var rootFrame = new Frame();
rootFrame.Navigate(typeof(DefaultPage));
Window.Current.Content = rootFrame;
Window.Current.Activate();

Но это не имеет никакого эффекта. Также я попытался использовать Application.Start(), но параметр должен быть обратным вызовом, и я не понимаю, какой именно.

------- Редактировать: я хочу следующее поведение.

  1. открыть IE (уже сделано)
  2. откройте Charm Bar и нажмите "Поделиться" (уже сделано)
  3. выберите мое приложение (уже сделано)
  4. Мое приложение показывает страницу общего доступа с информацией и кнопкой "Поделиться" (уже сделано)
  5. после нажатия кнопки "Поделиться" в моем приложении откройте главную страницу (на примере MS страницу по умолчанию)

Поэтому я не могу найти решение для последнего шага. Переключение со страницы общего доступа моего приложения на главную страницу моего приложения.

Редактировать конец -------

Все, что я хочу, - это запустить мое приложение после того, как с ним будет опубликован какой-то контент. Я надеюсь, что кто-нибудь может мне помочь. Или это невозможно?

---- Изменить 2:

App.xaml.cs:

using System;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

    // The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=234227

    namespace AppName
    {
        /// <summary>
        /// Provides application-specific behavior to supplement the default Application class.
        /// </summary>
        sealed partial class App : Application
        {
            /// <summary>
            /// Initializes the singleton application object.  This is the first line of authored code
            /// executed, and as such is the logical equivalent of main() or WinMain().
            /// </summary>
            public App()
            {
                this.InitializeComponent();
                this.Suspending += OnSuspending;
            }

            /// <summary>
            /// Invoked when the application is launched normally by the end user.  Other entry points
            /// will be used such as when the application is launched to open a specific file.
            /// </summary>
            /// <param name="e">Details about the launch request and process.</param>
        protected override void OnLaunched(LaunchActivatedEventArgs e)
        {

#if DEBUG
            if (System.Diagnostics.Debugger.IsAttached)
            {
                this.DebugSettings.EnableFrameRateCounter = true;
            }
#endif

            Frame rootFrame = Window.Current.Content as Frame;

            // Do not repeat app initialization when the Window already has content,
            // just ensure that the window is active
            if (rootFrame == null)
            {
                // Create a Frame to act as the navigation context and navigate to the first page
                rootFrame = new Frame();
                // Set the default language
                rootFrame.Language = Windows.Globalization.ApplicationLanguages.Languages[0];

                rootFrame.NavigationFailed += OnNavigationFailed;

                if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
                {
                    //TODO: Load state from previously suspended application
                }

                // Place the frame in the current Window
                Window.Current.Content = rootFrame;
            }

            if (rootFrame.Content == null)
            {
                // When the navigation stack isn't restored navigate to the first page,
                // configuring the new page by passing required information as a navigation
                // parameter
                rootFrame.Navigate(typeof(MainPage), e.Arguments);
            }
            // Ensure the current window is active
            Window.Current.Activate();
        }

        /// <summary>
        /// Invoked when Navigation to a certain page fails
        /// </summary>
        /// <param name="sender">The Frame which failed navigation</param>
        /// <param name="e">Details about the navigation failure</param>
        void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
        {
            throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
        }

        /// <summary>
        /// Invoked when application execution is being suspended.  Application state is saved
        /// without knowing whether the application will be terminated or resumed with the contents
        /// of memory still intact.
        /// </summary>
        /// <param name="sender">The source of the suspend request.</param>
        /// <param name="e">Details about the suspend request.</param>
        private void OnSuspending(object sender, SuspendingEventArgs e)
        {
            var deferral = e.SuspendingOperation.GetDeferral();
            //TODO: Save application state and stop any background activity
            deferral.Complete();
        }

        /// <summary>
        /// Invoked when the application is activated as the target of a sharing operation.
        /// </summary>
        /// <param name="e">Details about the activation request.</param>
        protected override void OnShareTargetActivated(Windows.ApplicationModel.Activation.ShareTargetActivatedEventArgs e)
        {
            var shareTargetPage = new AppName.ShareTargetPage();
            shareTargetPage.Activate(e);
            Window.Current.Activate();
        }

        protected override void OnActivated(IActivatedEventArgs args)
        {
            base.OnActivated(args);
        }

    }
}

MainPage.xaml.cs:

using System;
using Windows.UI.Xaml.Controls;


// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238

namespace AppName
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        public void ReceiveUri(Uri sharedWebLink)
        {
            tbMessages.Text = sharedWebLink.ToString();
        }

        protected override void OnNavigatedTo(Windows.UI.Xaml.Navigation.NavigationEventArgs e)
        {
            // It is possible to get in this method after the Share button at the 
            // sharetargetpage is clicked but at this point I don't know how to 
            // activate the app

            //base.OnNavigatedTo(e);
        }

    }
}

Sharepargetpage.xaml.cs:

using Windows.UI.Core;
using AppName.Common;
using System;
using Windows.ApplicationModel.Activation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;

// The Share Target Contract item template is documented at http://go.microsoft.com/fwlink/?LinkId=234241

namespace AppName
{
    /// <summary>
    /// This page allows other applications to share content through this application.
    /// </summary>
    public sealed partial class ShareTargetPage : Page
    {
        private Uri sharedWebLink;


        /// <summary>
        /// Provides a channel to communicate with Windows about the sharing operation.
        /// </summary>
        private Windows.ApplicationModel.DataTransfer.ShareTarget.ShareOperation _shareOperation;
        private ObservableDictionary defaultViewModel = new ObservableDictionary();

        /// <summary>
        /// This can be changed to a strongly typed view model.
        /// </summary>
        public ObservableDictionary DefaultViewModel
        {
            get { return this.defaultViewModel; }
        }

        public ShareTargetPage()
        {
            this.InitializeComponent();
        }

        /// <summary>
        /// Invoked when another application wants to share content through this application.
        /// </summary>
        /// <param name="e">Activation data used to coordinate the process with Windows.</param>
        public async void Activate(ShareTargetActivatedEventArgs e)
        {
            this._shareOperation = e.ShareOperation;

            // Communicate metadata about the shared content through the view model
            var shareProperties = this._shareOperation.Data.Properties;
            var thumbnailImage = new BitmapImage();
            this.DefaultViewModel["Title"] = shareProperties.Title;
            this.DefaultViewModel["Description"] = shareProperties.Description;
            this.DefaultViewModel["Image"] = thumbnailImage;
            this.DefaultViewModel["Sharing"] = false;
            this.DefaultViewModel["ShowImage"] = false;
            this.DefaultViewModel["Comment"] = String.Empty;
            this.DefaultViewModel["Placeholder"] = "Add a comment";
            this.DefaultViewModel["SupportsComment"] = true;
            Window.Current.Content = this;
            Window.Current.Activate();

            try
            {
                this.sharedWebLink = await this._shareOperation.Data.GetWebLinkAsync();
                this.DefaultViewModel["URL"] = this.sharedWebLink.ToString();
            }
            catch (Exception ex)
            {
                NotifyUserBackgroundThread("Failed GetWebLinkAsync - " + ex.Message, NotifyType.ErrorMessage);
            }

            // Update the shared content's thumbnail image in the background
            if (shareProperties.Thumbnail != null)
            {
                var stream = await shareProperties.Thumbnail.OpenReadAsync();
                thumbnailImage.SetSource(stream);
                this.DefaultViewModel["ShowImage"] = true;
            }
        }

        /// <summary>
        /// Invoked when the user clicks the Share button.
        /// </summary>
        /// <param name="sender">Instance of Button used to initiate sharing.</param>
        /// <param name="e">Event data describing how the button was clicked.</param>
        private void ShareButton_Click(object sender, RoutedEventArgs e)
        {
            this.DefaultViewModel["Sharing"] = true;
            this._shareOperation.ReportStarted();

            // TODO: Perform work appropriate to your sharing scenario using
            //       this._shareOperation.Data, typically with additional information captured
            //       through custom user interface elements added to this page such as 
            //       this.DefaultViewModel["Comment"]

            this._shareOperation.ReportCompleted();

            // TRY1: Navigate to MainPage
            //Frame rootFrame = Window.Current.Content as Frame;
            //if(rootFrame == null)
            //{
            //    rootFrame = new Frame();
            //    Window.Current.Content = rootFrame;
            //}
            //if(rootFrame.Content == null)
            //{
            //    rootFrame.Navigate(typeof(MainPage));
            //}

            //  TRY2: Navigate to MainPage
            //var p = rootFrame.Content as MainPage;
            //p.ReceiveUri(sharedWebLink);
            //Window.Current.Activate();


            var rootFrame = new Frame();
            rootFrame.Navigate(typeof(MainPage));
            Window.Current.Content = rootFrame;
            Window.Current.Activate();

            // TRY3: Start the App
            // Application.Start();
            // App.Start();
            // but I don't know which callback method should be the param of start
        }

        async private void NotifyUserBackgroundThread(string message, NotifyType type)
        {
            await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                NotifyUser(message, type);
            });
        }

        private void NotifyUser(string strMessage, NotifyType type)
        {
            switch (type)
            {
                // Use the status message style.
                case NotifyType.StatusMessage:
                    StatusBlock.Style = Resources["StatusStyle"] as Style;
                    break;
                // Use the error message style.
                case NotifyType.ErrorMessage:
                    StatusBlock.Style = Resources["ErrorStyle"] as Style;
                    break;
            }
            StatusBlock.Text = strMessage;
        }

        public enum NotifyType
        {
            StatusMessage,
            ErrorMessage
        };
    }
}

Редактировать 2 Конец ---------

2 ответа

Решение

Чтобы включить поведение вашего приложения в качестве приложения с таргетингом на общий доступ, необходимо переопределить OnShareTargetActivated(ShareTargetActivatedEventArgs args) метод в App учебный класс.

protected override void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
{
    var rootFrame = new Frame();

    // TODO: Load content in frame

    Window.Current.Content = rootFrame;
    Window.Current.Activate();
}

РЕДАКТИРОВАТЬ

Из вашей текущей реализации вы собираетесь установитьShareTargetPage внутри окна, а потом вы бросили Windows.Current.Content в Frame это всегда ноль. Таким образом, вы не можете сделать это так. Я рекомендую сделать это таким образом.

+ Изменить OnShareTargetActivated метод внутри App.xaml.cs для этого

protected override void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
{
    var rootFrame = new Frame();
    rootFrame.Navigate(typeof(ShareTargetPage), args);
    Window.Current.Content = rootFrame;
    Window.Current.Activate();
}

Удалить это из Activate метод в ShareTargetPage.xaml.cs

Window.Current.Content = this;
Window.Current.Activate();

Переопределение OnNavigatedTo в ShareTargetPage учебный класс

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    // Calling Activate method here
    Activate((ShareTargetActivatedEventArgs)e.Parameter);
}

А затем, чтобы перейти на другую страницу, вы можете просто Звонки Frame.Navigation что-то подобное внутри ShareTargetPage

this.Frame.Navigate(typeof(MainPage));

РЕДАКТИРОВАТЬ 2

Если вы хотите перейти на другую страницу при нажатии кнопки "Поделиться", удалите эту строку кода

this._shareOperation.ReportCompleted();

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

То, что вы пытаетесь сделать, противоречит рекомендациям Магазина Windows, и ваше приложение будет отклонено, если вам удастся его достичь.

См. Рекомендации здесь: http://msdn.microsoft.com/en-us/library/windows/apps/hh465251.aspx

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

Возможно, вы могли бы обойти это, добавив кнопку на панели общего доступа "Запустить полное приложение", а затем создать пользовательский URI, который запускает ваше приложение. Но это, вероятно, не рекомендуется.

Другие вопросы по тегам