Как переопределить OnLaunched() из Template10

Вот скриншот

Я пытаюсь переопределить функцию OnLaunched() в приложении Windows Template 10, но проблема в том, что она запечатана в классе BootStrapper Template 10 (который наследуется от класса Application).

Вот мой метод:

using Windows.UI.Xaml;
...

namespace Sample {
...
sealed partial class App : Template10.Common.BootStrapper {

protected override void OnLaunched(LaunchActivatedEventArgs args)
{

    /*************** My stuff *****************
    ***********************************************/
}
...
}

Я использую пустое приложение Template10 для этого приложения, а метод OnLaunched() в классе BootStrapper таков:

namespace Template10.Common
{
public abstract class BootStrapper : Application
{
    ...
    protected sealed override void OnLaunched(LaunchActivatedEventArgs e);
    ...
}
...
}

Я не могу удалить запечатанный модификатор из OnLaunched() в BootStrapper (думаю, потому что это "из метаданных").

Какой смысл включать запечатанный метод в абстрактный класс?

Получаем ли мы какой-либо другой метод для переопределения, например OnResume(), OnStartAsync() и т. д., вместо OnLaunched()?

Обновление: для справки, вот все участники BootStrapper:

public abstract class BootStrapper : Application
{
    public const string DefaultTileID = "App";

    protected BootStrapper();

    public static BootStrapper Current { get; }
    public TimeSpan CacheMaxDuration { get; set; }
    public INavigationService NavigationService { get; }
    public StateItems SessionState { get; set; }
    public bool ShowShellBackButton { get; set; }
    protected Func<SplashScreen, UserControl> SplashFactory { get; set; }

    public event EventHandler<WindowCreatedEventArgs> WindowCreated;

    public static AdditionalKinds DetermineStartCause(IActivatedEventArgs args);
    public NavigationService NavigationServiceFactory(BackButton backButton, ExistingContent existingContent);
    [AsyncStateMachine(typeof(<OnInitializeAsync>d__44))]
    public virtual Task OnInitializeAsync(IActivatedEventArgs args);
    public virtual void OnResuming(object s, object e);
    public abstract Task OnStartAsync(StartKind startKind, IActivatedEventArgs args);
    [AsyncStateMachine(typeof(<OnSuspendingAsync>d__45))]
    public virtual Task OnSuspendingAsync(object s, SuspendingEventArgs e);
    public Dictionary<T, Type> PageKeys<T>() where T : struct, IConvertible;
    public virtual T Resolve<T>(Type type);
    public virtual INavigable ResolveForPage(Type page, NavigationService navigationService);
    public void UpdateShellBackButton();
    [AsyncStateMachine(typeof(<OnActivated>d__26))]
    protected sealed override void OnActivated(IActivatedEventArgs e);
    [AsyncStateMachine(typeof(<OnCachedFileUpdaterActivated>d__27))]
    protected sealed override void OnCachedFileUpdaterActivated(CachedFileUpdaterActivatedEventArgs args);
    [AsyncStateMachine(typeof(<OnFileActivated>d__28))]
    protected sealed override void OnFileActivated(FileActivatedEventArgs args);
    [AsyncStateMachine(typeof(<OnFileOpenPickerActivated>d__29))]
    protected sealed override void OnFileOpenPickerActivated(FileOpenPickerActivatedEventArgs args);
    [AsyncStateMachine(typeof(<OnFileSavePickerActivated>d__30))]
    protected sealed override void OnFileSavePickerActivated(FileSavePickerActivatedEventArgs args);
    protected sealed override void OnLaunched(LaunchActivatedEventArgs e);
    [AsyncStateMachine(typeof(<OnSearchActivated>d__31))]
    protected sealed override void OnSearchActivated(SearchActivatedEventArgs args);
    [AsyncStateMachine(typeof(<OnShareTargetActivated>d__32))]
    protected sealed override void OnShareTargetActivated(ShareTargetActivatedEventArgs args);
    protected sealed override void OnWindowCreated(WindowCreatedEventArgs args);

    public enum AdditionalKinds
    {
        Primary,
        Toast,
        SecondaryTile,
        Other
    }
    public enum BackButton
    {
        Attach,
        Ignore
    }
    public enum ExistingContent
    {
        Include,
        Exclude
    }
    public enum StartKind
    {
        Launch,
        Activate
    }
}

Пожалуйста помоги :}


person Anubhav Dhawan    schedule 04.11.2015    source источник
comment
Покажите реальный код. Это не должно быть проблемой.   -  person i3arnon    schedule 04.11.2015


Ответы (2)


Шаблон 10 не позволяет нам переопределить метод OnLaunched(). Вместо этого мы можем переопределить методы OnInitializeAsync() и OnStartAsync() для этой цели.

Причина в том, что Шаблон 10 рекомендует нам использовать так называемую одностраничную модель, которая представляет собой не что иное, как использование одного экземпляра класса Page для помещения в пустой фрейм, предоставленный фреймворком. Чем это полезно для нас? Что ж, если нам нужно поместить меню, скажем, гамбургер-меню, в наше приложение, тогда нам нужно скопировать код меню на каждую страницу, которую мы создаем в нашем приложении. Это может привести к таким вещам, как избыточность, несогласованность, WET-код и т. д. и т. д.

Поэтому шаблон 10 изначально создает страницу, которую они называют оболочкой, а затем содержимое каждой страницы загружается в эту страницу оболочки вместо создания новых страниц.

Мы можем переопределить эти методы следующим образом:

sealed partial class App : BootStrapper
{
public App()
{
    this.InitializeComponent();
}

public override Task OnInitializeAsync(IActivatedEventArgs args)
{
    var nav = NavigationServiceFactory(BackButton.Attach, ExistingContent.Include);
    Window.Current.Content = new Views.Shell(nav);
    return Task.FromResult<object>(null);
}

public override Task OnStartAsync(BootStrapper.StartKind startKind, IActivatedEventArgs args)
{
    NavigationService.Navigate(typeof(Views.MainPage));
    return Task.FromResult<object>(null);
}
}

Вот где я понял ответ: https://github.com/Windows-XAML/Template10/wiki/Docs-%7C-HamburgerMenu

Короче говоря, переопределите OnInitializeAsync() или OnStartAsync() вместо OnLaunched().

person Anubhav Dhawan    schedule 10.11.2015
comment
Чтобы было ясно, вам не нужно создавать Shell.xaml. - person Jerry Nixon; 01.02.2016

Вы пытаетесь переопределить OnLaunched в MyPage.xaml.cs, и я вполне уверен, что ваш класс MyPage не наследуется от Application. Таким образом, у него нет метода OnLaunched() (по крайней мере, с этой подписью). Что вам нужно сделать, так это переопределить его в App.xaml.cs, поскольку это Application.OnLaunched(). Класс App, который находится в App.xaml.cs, наследуется от Application.

Кстати, это пример из пустого шаблона приложения, о котором вы упомянули:

введите здесь описание изображения

person B.K.    schedule 05.11.2015
comment
Хорошо... на один шаг ближе :) Я поместил это в App.Xaml.cs (и мне было глупо помещать его в класс MyPage). Теперь я получаю еще одну ошибку, вставляя OnLaunched() в класс приложения, а именно: › Код серьезности Описание Ошибка строки файла проекта CS0239 «App.OnLaunched (LaunchActivatedEventArgs)»: не может переопределить унаследованный член «BootStrapper.OnLaunched (LaunchActivatedEventArgs)», потому что запечатан MyPractice C:\Users\anubh\Documents\Visual Studio 2015\MyPractice\MyPractice\App.xaml.cs 24 - person Anubhav Dhawan; 05.11.2015
comment
Теперь первое, что приходит мне в голову, это изменить базовый класс для класса App с Template10.Common.BootStrapper на Application (и использовать Windows.UI.Xaml). Я сделал это и догадываюсь, что ... Я СНОВА получаю ту же ошибку › Код серьезности Описание Ошибка строки файла проекта CS0115 «App.OnLaunched (LaunchActivatedEventArgs)»: не найден подходящий метод для переопределения MyPractice C:\Users\anubh\Documents\Visual Студия 2015\Моя практика\Моя практика\App.xaml.cs 24 - person Anubhav Dhawan; 05.11.2015
comment
Эта ошибка›Код серьезности Описание Ошибка строки файла проекта CS0263 Частичные объявления «Приложения» не должны указывать разные базовые классы MyPractice C:\Users\anubh\Documents\Visual Studio 2015\MyPractice\MyPractice\obj\x86\Debug\App.g.i. cs 29 ... не позволяет мне изменить BootStrapper на Application. Есть ли способ наследовать оба класса или использовать OnLaunched() в самом BootStrapper? - person Anubhav Dhawan; 05.11.2015
comment
comment
Да, я видел эту страницу. Вы нашли в этом документе альтернативу OnLaunched()? - person Anubhav Dhawan; 07.11.2015
comment
@AnubhavDhawan Есть масса примеров. Тем не менее, я указал, в чем заключается ваша ошибка и как ее исправить в отношении вашего первоначального вопроса ... вам придется выполнить остальную работу самостоятельно. - person B.K.; 07.11.2015
comment
Наконец нашел ответ. Спасибо @B.K. :D - person Anubhav Dhawan; 10.11.2015