//
// App.xaml.cpp
// App 类的实现。
//
#include "pch.h"
#include "MainPage.xaml.h"
using namespace SDLPal;
using namespace Platform;
using namespace Windows::ApplicationModel;
using namespace Windows::ApplicationModel::Activation;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Controls::Primitives;
using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Interop;
using namespace Windows::UI::Xaml::Media;
using namespace Windows::UI::Xaml::Media::Animation;
using namespace Windows::UI::Xaml::Navigation;
// “空白应用程序”模板在 http://go.microsoft.com/fwlink/?LinkID=391641 上有介绍
///
/// 初始化单一实例应用程序对象。这是执行的创作代码的第一行,
/// 已执行,逻辑上等同于 main() 或 WinMain()。
///
App::App()
{
InitializeComponent();
Suspending += ref new SuspendingEventHandler(this, &App::OnSuspending);
}
///
/// 在最终用户正常启动应用程序时调用。将在启动应用程序
/// 当启动应用程序以打开特定的文件或显示时使用
/// 搜索结果等
///
/// 有关启动请求和过程的详细信息。
void App::OnLaunched(LaunchActivatedEventArgs^ e)
{
#if _DEBUG
if (IsDebuggerPresent())
{
DebugSettings->EnableFrameRateCounter = true;
}
#endif
auto rootFrame = dynamic_cast(Window::Current->Content);
// 不要在窗口已包含内容时重复应用程序初始化,
// 只需确保窗口处于活动状态。
if (rootFrame == nullptr)
{
// 创建一个 Frame 以用作导航上下文并将其与
// SuspensionManager 键关联
rootFrame = ref new Frame();
// TODO: 将此值更改为适合您的应用程序的缓存大小。
rootFrame->CacheSize = 1;
//设置默认语言
rootFrame->Language = Windows::Globalization::ApplicationLanguages::Languages->GetAt(0);
if (e->PreviousExecutionState == ApplicationExecutionState::Terminated)
{
// TODO: 仅当适用时还原保存的会话状态,并安排
// 还原完成后的最终启动步骤。
}
// 将框架放在当前窗口中
Window::Current->Content = rootFrame;
}
if (rootFrame->Content == nullptr)
{
// 删除用于启动的旋转门导航。
if (rootFrame->ContentTransitions != nullptr)
{
_transitions = ref new TransitionCollection();
for (auto transition : rootFrame->ContentTransitions)
{
_transitions->Append(transition);
}
}
rootFrame->ContentTransitions = nullptr;
_firstNavigatedToken = rootFrame->Navigated += ref new NavigatedEventHandler(this, &App::RootFrame_FirstNavigated);
// 当导航堆栈尚未还原时,导航到第一页,
// 并通过将所需信息作为导航参数传入来配置
// 新页面。
if (!rootFrame->Navigate(MainPage::typeid, e->Arguments))
{
throw ref new FailureException("Failed to create initial page");
}
}
// 确保当前窗口处于活动状态
Window::Current->Activate();
}
///
/// 启动应用程序后还原内容转换。
///
void App::RootFrame_FirstNavigated(Object^ sender, NavigationEventArgs^ e)
{
auto rootFrame = safe_cast(sender);
TransitionCollection^ newTransitions;
if (_transitions == nullptr)
{
newTransitions = ref new TransitionCollection();
newTransitions->Append(ref new NavigationThemeTransition());
}
else
{
newTransitions = _transitions;
}
rootFrame->ContentTransitions = newTransitions;
rootFrame->Navigated -= _firstNavigatedToken;
}
void SDLPal::App::OnActivated(Windows::ApplicationModel::Activation::IActivatedEventArgs ^ args)
{
if (dynamic_cast(args) != nullptr)
{
auto contdata = dynamic_cast(args)->ContinuationData;
auto page = dynamic_cast(contdata->Lookup("Page"));
auto target = contdata->HasKey("Target") ? dynamic_cast(contdata->Lookup("Target")) : nullptr;
switch (args->Kind)
{
case ActivationKind::PickFolderContinuation:
page->SetPath(dynamic_cast(args)->Folder);
break;
case ActivationKind::PickFileContinuation:
if (dynamic_cast(args)->Files->Size > 0)
{
page->SetFile(target, dynamic_cast(args)->Files->GetAt(0));
}
break;
case ActivationKind::PickSaveFileContinuation:
if (dynamic_cast(args)->File)
{
page->SetFile(target, dynamic_cast(args)->File);
}
break;
}
}
Application::OnActivated(args);
}
///
/// 在将要挂起应用程序执行时调用。将保存应用程序状态
/// 无需知道应用程序会被终止还是会恢复,
/// 并让内存内容保持不变。
///
void App::OnSuspending(Object^ sender, SuspendingEventArgs^ e)
{
(void) sender; // 未使用的参数
(void) e; // 未使用的参数
// TODO: 保存应用程序状态并停止任何后台活动
}