diff --git a/NanaZip.Frieren/NanaZip.Frieren.DarkMode.cpp b/NanaZip.Frieren/NanaZip.Frieren.DarkMode.cpp index 84f8bdac6..0de885c10 100644 --- a/NanaZip.Frieren/NanaZip.Frieren.DarkMode.cpp +++ b/NanaZip.Frieren/NanaZip.Frieren.DarkMode.cpp @@ -331,6 +331,21 @@ namespace } } + static bool IsFileManagerWindow( + _In_ HWND WindowHandle) + { + wchar_t ClassName[256] = { 0 }; + if (0 != ::GetClassNameW( + WindowHandle, + ClassName, + 256)) + { + return (0 == std::wcscmp(ClassName, L"FM")); + } + + return false; + } + LRESULT CALLBACK WindowSubclassCallback( _In_ HWND hWnd, _In_ UINT uMsg, @@ -397,7 +412,17 @@ namespace bool ShouldExtendFrame = (g_ShouldAppsUseDarkMode && ::IsStandardDynamicRangeMode()); - MARGINS Margins = { (ShouldExtendFrame ? -1 : 0) }; + MARGINS Margins = { 0 }; + if (ShouldExtendFrame) + { + Margins = { -1 }; + } + else if (::IsFileManagerWindow(hWnd)) + { + UINT DpiValue = ::GetDpiForWindow(hWnd); + Margins.cyTopHeight = + ::MulDiv(48, DpiValue, USER_DEFAULT_SCREEN_DPI); + } ::DwmExtendFrameIntoClientArea(hWnd, &Margins); ::EnumChildWindows( @@ -439,6 +464,15 @@ namespace MARGINS Margins = { -1 }; ::DwmExtendFrameIntoClientArea(hWnd, &Margins); } + else if (::IsFileManagerWindow(hWnd)) + { + UINT DpiValue = ::GetDpiForWindow(hWnd); + + MARGINS Margins = { 0 }; + Margins.cyTopHeight = + ::MulDiv(48, DpiValue, USER_DEFAULT_SCREEN_DPI); + ::DwmExtendFrameIntoClientArea(hWnd, &Margins); + } ::RefreshWindowTheme(hWnd); @@ -485,6 +519,22 @@ namespace break; } + case WM_DPICHANGED: + { + bool ShouldExtendFrame = + (g_ShouldAppsUseDarkMode && ::IsStandardDynamicRangeMode()); + if (!ShouldExtendFrame && ::IsFileManagerWindow(hWnd)) + { + UINT DpiValue = ::GetDpiForWindow(hWnd); + + MARGINS Margins = { 0 }; + Margins.cyTopHeight = + ::MulDiv(48, DpiValue, USER_DEFAULT_SCREEN_DPI); + ::DwmExtendFrameIntoClientArea(hWnd, &Margins); + } + + break; + } default: break; } diff --git a/NanaZip.UI.Modern/Assets/Toolbar/Add_24x24.bmp b/NanaZip.UI.Modern/Assets/Toolbar/Add_24x24.bmp deleted file mode 100644 index 90ed3a3cb..000000000 Binary files a/NanaZip.UI.Modern/Assets/Toolbar/Add_24x24.bmp and /dev/null differ diff --git a/NanaZip.UI.Modern/Assets/Toolbar/Add_32x32.bmp b/NanaZip.UI.Modern/Assets/Toolbar/Add_32x32.bmp deleted file mode 100644 index 70b4bfb6c..000000000 Binary files a/NanaZip.UI.Modern/Assets/Toolbar/Add_32x32.bmp and /dev/null differ diff --git a/NanaZip.UI.Modern/Assets/Toolbar/Copy_24x24.bmp b/NanaZip.UI.Modern/Assets/Toolbar/Copy_24x24.bmp deleted file mode 100644 index 67c5f4fc2..000000000 Binary files a/NanaZip.UI.Modern/Assets/Toolbar/Copy_24x24.bmp and /dev/null differ diff --git a/NanaZip.UI.Modern/Assets/Toolbar/Copy_32x32.bmp b/NanaZip.UI.Modern/Assets/Toolbar/Copy_32x32.bmp deleted file mode 100644 index 13a9eff57..000000000 Binary files a/NanaZip.UI.Modern/Assets/Toolbar/Copy_32x32.bmp and /dev/null differ diff --git a/NanaZip.UI.Modern/Assets/Toolbar/Delete_24x24.bmp b/NanaZip.UI.Modern/Assets/Toolbar/Delete_24x24.bmp deleted file mode 100644 index f88368cb1..000000000 Binary files a/NanaZip.UI.Modern/Assets/Toolbar/Delete_24x24.bmp and /dev/null differ diff --git a/NanaZip.UI.Modern/Assets/Toolbar/Delete_32x32.bmp b/NanaZip.UI.Modern/Assets/Toolbar/Delete_32x32.bmp deleted file mode 100644 index f561b88ef..000000000 Binary files a/NanaZip.UI.Modern/Assets/Toolbar/Delete_32x32.bmp and /dev/null differ diff --git a/NanaZip.UI.Modern/Assets/Toolbar/Extract_24x24.bmp b/NanaZip.UI.Modern/Assets/Toolbar/Extract_24x24.bmp deleted file mode 100644 index 07f387326..000000000 Binary files a/NanaZip.UI.Modern/Assets/Toolbar/Extract_24x24.bmp and /dev/null differ diff --git a/NanaZip.UI.Modern/Assets/Toolbar/Extract_32x32.bmp b/NanaZip.UI.Modern/Assets/Toolbar/Extract_32x32.bmp deleted file mode 100644 index e7e4a0602..000000000 Binary files a/NanaZip.UI.Modern/Assets/Toolbar/Extract_32x32.bmp and /dev/null differ diff --git a/NanaZip.UI.Modern/Assets/Toolbar/Info_24x24.bmp b/NanaZip.UI.Modern/Assets/Toolbar/Info_24x24.bmp deleted file mode 100644 index 82de9d941..000000000 Binary files a/NanaZip.UI.Modern/Assets/Toolbar/Info_24x24.bmp and /dev/null differ diff --git a/NanaZip.UI.Modern/Assets/Toolbar/Info_32x32.bmp b/NanaZip.UI.Modern/Assets/Toolbar/Info_32x32.bmp deleted file mode 100644 index 692b58f81..000000000 Binary files a/NanaZip.UI.Modern/Assets/Toolbar/Info_32x32.bmp and /dev/null differ diff --git a/NanaZip.UI.Modern/Assets/Toolbar/Move_24x24.bmp b/NanaZip.UI.Modern/Assets/Toolbar/Move_24x24.bmp deleted file mode 100644 index 88041bacd..000000000 Binary files a/NanaZip.UI.Modern/Assets/Toolbar/Move_24x24.bmp and /dev/null differ diff --git a/NanaZip.UI.Modern/Assets/Toolbar/Move_32x32.bmp b/NanaZip.UI.Modern/Assets/Toolbar/Move_32x32.bmp deleted file mode 100644 index 48a692471..000000000 Binary files a/NanaZip.UI.Modern/Assets/Toolbar/Move_32x32.bmp and /dev/null differ diff --git a/NanaZip.UI.Modern/Assets/Toolbar/Test_24x24.bmp b/NanaZip.UI.Modern/Assets/Toolbar/Test_24x24.bmp deleted file mode 100644 index 71ae978c7..000000000 Binary files a/NanaZip.UI.Modern/Assets/Toolbar/Test_24x24.bmp and /dev/null differ diff --git a/NanaZip.UI.Modern/Assets/Toolbar/Test_32x32.bmp b/NanaZip.UI.Modern/Assets/Toolbar/Test_32x32.bmp deleted file mode 100644 index 39650107b..000000000 Binary files a/NanaZip.UI.Modern/Assets/Toolbar/Test_32x32.bmp and /dev/null differ diff --git a/NanaZip.UI.Modern/MainWindowToolBarPage.cpp b/NanaZip.UI.Modern/MainWindowToolBarPage.cpp index baf4741d2..77e6d67b2 100644 --- a/NanaZip.UI.Modern/MainWindowToolBarPage.cpp +++ b/NanaZip.UI.Modern/MainWindowToolBarPage.cpp @@ -4,9 +4,85 @@ #include "MainWindowToolBarPage.g.cpp" #endif +#include +#include + +#include "../SevenZip/CPP/Common/Common.h" +#include "../SevenZip/CPP/7zip/UI/FileManager/resource.h" +#include "../SevenZip/CPP/7zip/UI/FileManager/LangUtils.h" + +#include "NanaZip.UI.h" + +#include + +namespace +{ + DWORD GetShellProcessId() + { + HWND ShellWindowHandle = ::GetShellWindow(); + if (!ShellWindowHandle) + { + return static_cast(-1); + } + + DWORD ShellProcessId = static_cast(-1); + if (!::GetWindowThreadProcessId(ShellWindowHandle, &ShellProcessId)) + { + return static_cast(-1); + } + return ShellProcessId; + } + + std::wstring GetCurrentProcessModulePath() + { + // 32767 is the maximum path length without the terminating null character. + std::wstring Path(32767, L'\0'); + Path.resize(::GetModuleFileNameW( + nullptr, &Path[0], static_cast(Path.size()))); + return Path; + } +} + +namespace winrt +{ + using Windows::Foundation::Point; + using Windows::Foundation::IAsyncAction; + using Windows::Services::Store::StoreProduct; + using Windows::Services::Store::StoreProductQueryResult; + using Windows::System::DispatcherQueuePriority; + using Windows::UI::Xaml::Automation::AutomationProperties; + using Windows::UI::Xaml::Controls::AppBarButton; + using Windows::UI::Xaml::Controls::ToolTipService; + using Windows::UI::Xaml::Media::GeneralTransform; +} + using namespace winrt; using namespace Windows::UI::Xaml; +namespace +{ + namespace ToolBarCommandID + { + enum + { + Add = 1070, + Extract = 1071, + Test = 1072, + }; + } + + namespace MenuIndex + { + enum + { + File = 0, + Edit, + View, + Bookmarks + }; + } +} + namespace winrt::NanaZip::Modern::implementation { MainWindowToolBarPage::MainWindowToolBarPage( @@ -19,5 +95,433 @@ namespace winrt::NanaZip::Modern::implementation void MainWindowToolBarPage::InitializeComponent() { MainWindowToolBarPageT::InitializeComponent(); + + DWORD ToolBarResources[10] = + { + IDS_ADD, + IDS_EXTRACT, + IDS_TEST, + IDS_BUTTON_COPY, + IDS_BUTTON_MOVE, + IDS_BUTTON_DELETE, + IDS_BUTTON_INFO, + IDM_OPTIONS, + IDM_BENCHMARK, + IDM_ABOUT + }; + + winrt::AppBarButton ToolBarButtons[10] = + { + this->AddButton(), + this->ExtractButton(), + this->TestButton(), + this->CopyButton(), + this->MoveButton(), + this->DeleteButton(), + this->InfoButton(), + this->OptionsButton(), + this->BenchmarkButton(), + this->AboutButton() + }; + + const std::size_t ToolBarButtonCount = + sizeof(ToolBarButtons) / sizeof(*ToolBarButtons); + + for (size_t i = 0; i < ToolBarButtonCount; ++i) + { + std::wstring Resource = std::wstring( + ::LangString(ToolBarResources[i])); + winrt::AutomationProperties::SetName( + ToolBarButtons[i], + Resource); + winrt::ToolTipService::SetToolTip( + ToolBarButtons[i], + winrt::box_value(Resource)); + } + + this->m_DispatcherQueue = + winrt::DispatcherQueue::GetForCurrentThread(); + + this->m_StoreContext = winrt::StoreContext::GetDefault(); + if (this->m_StoreContext) + { + winrt::check_hresult( + this->m_StoreContext.as()->Initialize( + this->m_WindowHandle)); + } + } + + void MainWindowToolBarPage::PageLoaded( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e) + { + UNREFERENCED_PARAMETER(sender); + UNREFERENCED_PARAMETER(e); + + this->RefreshSponsorButtonContent(); + } + + void MainWindowToolBarPage::AddButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e) + { + UNREFERENCED_PARAMETER(sender); + UNREFERENCED_PARAMETER(e); + + ::PostMessageW( + this->m_WindowHandle, + WM_COMMAND, + MAKEWPARAM( + ToolBarCommandID::Add, + BN_CLICKED), + 0); + } + + void MainWindowToolBarPage::ExtractButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e) + { + UNREFERENCED_PARAMETER(sender); + UNREFERENCED_PARAMETER(e); + + ::PostMessageW( + this->m_WindowHandle, + WM_COMMAND, + MAKEWPARAM( + ToolBarCommandID::Extract, + BN_CLICKED), + 0); + } + + void MainWindowToolBarPage::TestButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e) + { + UNREFERENCED_PARAMETER(sender); + UNREFERENCED_PARAMETER(e); + + ::PostMessageW( + this->m_WindowHandle, + WM_COMMAND, + MAKEWPARAM( + ToolBarCommandID::Test, + BN_CLICKED), + 0); + } + + void MainWindowToolBarPage::CopyButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e) + { + UNREFERENCED_PARAMETER(sender); + UNREFERENCED_PARAMETER(e); + + ::PostMessageW( + this->m_WindowHandle, + WM_COMMAND, + MAKEWPARAM( + IDM_COPY_TO, + BN_CLICKED), + 0); + } + + void MainWindowToolBarPage::MoveButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e) + { + UNREFERENCED_PARAMETER(sender); + UNREFERENCED_PARAMETER(e); + + ::PostMessageW( + this->m_WindowHandle, + WM_COMMAND, + MAKEWPARAM( + IDM_MOVE_TO, + BN_CLICKED), + 0); + } + + void MainWindowToolBarPage::DeleteButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e) + { + UNREFERENCED_PARAMETER(sender); + UNREFERENCED_PARAMETER(e); + + ::PostMessageW( + this->m_WindowHandle, + WM_COMMAND, + MAKEWPARAM( + IDM_DELETE, + BN_CLICKED), + 0); + } + + void MainWindowToolBarPage::InfoButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e) + { + UNREFERENCED_PARAMETER(sender); + UNREFERENCED_PARAMETER(e); + + ::PostMessageW( + this->m_WindowHandle, + WM_COMMAND, + MAKEWPARAM( + IDM_PROPERTIES, + BN_CLICKED), + 0); + } + + void MainWindowToolBarPage::OptionsButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e) + { + UNREFERENCED_PARAMETER(sender); + UNREFERENCED_PARAMETER(e); + + ::PostMessageW( + this->m_WindowHandle, + WM_COMMAND, + MAKEWPARAM( + IDM_OPTIONS, + BN_CLICKED), + 0); + } + + void MainWindowToolBarPage::BenchmarkButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e) + { + UNREFERENCED_PARAMETER(sender); + UNREFERENCED_PARAMETER(e); + + ::PostMessageW( + this->m_WindowHandle, + WM_COMMAND, + MAKEWPARAM( + IDM_BENCHMARK, + BN_CLICKED), + 0); + } + + void MainWindowToolBarPage::AboutButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e) + { + UNREFERENCED_PARAMETER(sender); + UNREFERENCED_PARAMETER(e); + + NanaZip::UI::ShowAboutDialog(this->m_WindowHandle); + } + + void MainWindowToolBarPage::MoreButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e) + { + UNREFERENCED_PARAMETER(sender); + UNREFERENCED_PARAMETER(e); + + winrt::AppBarButton Button = sender.as(); + + winrt::GeneralTransform Transform = + Button.TransformToVisual(this->Content()); + winrt::Point LogicalPoint = Transform.TransformPoint( + winrt::Point(0.0f, 0.0f)); + + extern HMENU g_MoreMenu; + + UINT DpiValue = ::GetDpiForWindow(this->m_WindowHandle); + + POINT MenuPosition = { 0 }; + MenuPosition.x = ::MulDiv( + static_cast(LogicalPoint.X), + DpiValue, + USER_DEFAULT_SCREEN_DPI); + MenuPosition.y = ::MulDiv( + 48, + DpiValue, + USER_DEFAULT_SCREEN_DPI); + ::MapWindowPoints( + this->m_WindowHandle, + HWND_DESKTOP, + &MenuPosition, + 1); + + ::SendMessageW( + this->m_WindowHandle, + WM_INITMENUPOPUP, + reinterpret_cast(::GetSubMenu( + g_MoreMenu, + MenuIndex::File)), + MenuIndex::File); + ::SendMessageW( + this->m_WindowHandle, + WM_INITMENUPOPUP, + reinterpret_cast(::GetSubMenu( + g_MoreMenu, + MenuIndex::Edit)), + MenuIndex::Edit); + ::SendMessageW( + this->m_WindowHandle, + WM_INITMENUPOPUP, + reinterpret_cast(::GetSubMenu( + g_MoreMenu, + MenuIndex::View)), + MenuIndex::View); + ::SendMessageW( + this->m_WindowHandle, + WM_INITMENUPOPUP, + reinterpret_cast(::GetSubMenu( + g_MoreMenu, + MenuIndex::Bookmarks)), + MenuIndex::Bookmarks); + + WPARAM Command = ::TrackPopupMenuEx( + g_MoreMenu, + TPM_LEFTALIGN | TPM_NONOTIFY | TPM_RETURNCMD, + MenuPosition.x, + MenuPosition.y, + this->m_WindowHandle, + nullptr); + if (Command) + { + ::PostMessageW(this->m_WindowHandle, WM_COMMAND, Command, 0); + } + } + + void MainWindowToolBarPage::SponsorButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e) + { + UNREFERENCED_PARAMETER(sender); + UNREFERENCED_PARAMETER(e); + + winrt::handle(Mile::CreateThread([=]() + { + DWORD ShellProcessId = ::GetShellProcessId(); + if (static_cast(-1) == ShellProcessId) + { + return; + } + + HANDLE ShellProcessHandle = nullptr; + + auto Handler = Mile::ScopeExitTaskHandler([&]() + { + if (ShellProcessHandle) + { + ::CloseHandle(ShellProcessHandle); + } + }); + + ShellProcessHandle = ::OpenProcess( + PROCESS_CREATE_PROCESS, + FALSE, + ShellProcessId); + if (!ShellProcessHandle) + { + return; + } + + SIZE_T AttributeListSize = 0; + ::InitializeProcThreadAttributeList( + nullptr, + 1, + 0, + &AttributeListSize); + + std::vector AttributeListBuffer = + std::vector(AttributeListSize); + + PPROC_THREAD_ATTRIBUTE_LIST AttributeList = + reinterpret_cast( + &AttributeListBuffer[0]); + + if (!::InitializeProcThreadAttributeList( + AttributeList, + 1, + 0, + &AttributeListSize)) + { + return; + } + + if (!::UpdateProcThreadAttribute( + AttributeList, + 0, + PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, + &ShellProcessHandle, + sizeof(ShellProcessHandle), + nullptr, + nullptr)) + { + return; + } + + STARTUPINFOEXW StartupInfoEx = { 0 }; + PROCESS_INFORMATION ProcessInformation = { 0 }; + StartupInfoEx.StartupInfo.cb = sizeof(STARTUPINFOEXW); + StartupInfoEx.lpAttributeList = AttributeList; + + std::wstring ApplicationName = ::GetCurrentProcessModulePath(); + + if (!::CreateProcessW( + ApplicationName.c_str(), + const_cast(L"NanaZip --AcquireSponsorEdition"), + nullptr, + nullptr, + TRUE, + CREATE_UNICODE_ENVIRONMENT | EXTENDED_STARTUPINFO_PRESENT, + nullptr, + nullptr, + &StartupInfoEx.StartupInfo, + &ProcessInformation)) + { + return; + } + + ::CloseHandle(ProcessInformation.hThread); + ::WaitForSingleObjectEx(ProcessInformation.hProcess, INFINITE, FALSE); + ::CloseHandle(ProcessInformation.hProcess); + + this->RefreshSponsorButtonContent(); + })); + } + + void MainWindowToolBarPage::RefreshSponsorButtonContent() + { + winrt::handle(Mile::CreateThread([=]() + { + if (this->m_StoreContext) + { + bool Sponsored = false; + + winrt::StoreProductQueryResult ProductQueryResult = + this->m_StoreContext.GetStoreProductsAsync( + { L"Durable" }, + { L"9N9DNPT6D6Z9" }).get(); + for (auto Item : ProductQueryResult.Products()) + { + winrt::StoreProduct Product = Item.Value(); + Sponsored = Product.IsInUserCollection(); + } + + if (!this->m_DispatcherQueue) + { + return; + } + this->m_DispatcherQueue.TryEnqueue( + winrt::DispatcherQueuePriority::Normal, + [=]() + { + this->SponsorButton().Content( + winrt::box_value(Mile::WinRT::GetLocalizedString( + Sponsored + ? L"MainWindowToolBarPage/SponsorButton/SponsoredText" + : L"MainWindowToolBarPage/SponsorButton/AcquireText"))); + }); + } + })); } } diff --git a/NanaZip.UI.Modern/MainWindowToolBarPage.h b/NanaZip.UI.Modern/MainWindowToolBarPage.h index 7e6446cff..f382b3b3c 100644 --- a/NanaZip.UI.Modern/MainWindowToolBarPage.h +++ b/NanaZip.UI.Modern/MainWindowToolBarPage.h @@ -4,12 +4,16 @@ #include +#include +#include + namespace winrt { using Windows::Foundation::IInspectable; + using Windows::Services::Store::StoreContext; + using Windows::System::DispatcherQueue; using Windows::UI::Xaml::RoutedEventArgs; } - namespace winrt::NanaZip::Modern::implementation { struct MainWindowToolBarPage : MainWindowToolBarPageT @@ -21,9 +25,65 @@ namespace winrt::NanaZip::Modern::implementation void InitializeComponent(); + void PageLoaded( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e); + + void AddButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e); + + void ExtractButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e); + + void TestButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e); + + void CopyButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e); + + void MoveButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e); + + void DeleteButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e); + + void InfoButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e); + + void OptionsButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e); + + void BenchmarkButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e); + + void AboutButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e); + + void MoreButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e); + + void SponsorButtonClick( + winrt::IInspectable const& sender, + winrt::RoutedEventArgs const& e); + private: HWND m_WindowHandle; + winrt::DispatcherQueue m_DispatcherQueue = nullptr; + winrt::StoreContext m_StoreContext = nullptr; + + void RefreshSponsorButtonContent(); }; } diff --git a/NanaZip.UI.Modern/MainWindowToolBarPage.xaml b/NanaZip.UI.Modern/MainWindowToolBarPage.xaml index 5f9005ff5..11353367b 100644 --- a/NanaZip.UI.Modern/MainWindowToolBarPage.xaml +++ b/NanaZip.UI.Modern/MainWindowToolBarPage.xaml @@ -5,6 +5,7 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="using:NanaZip.Modern" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + Loaded="PageLoaded" mc:Ignorable="d"> @@ -27,33 +28,38 @@ + ToolTipService.ToolTip="[Add]" /> + ToolTipService.ToolTip="[Extract]" /> + ToolTipService.ToolTip="[Test]" /> + ToolTipService.ToolTip="[Copy]" /> + AutomationProperties.Name="[Move]" + Click="MoveButtonClick" + ToolTipService.ToolTip="[Move]"> @@ -61,14 +67,16 @@ + ToolTipService.ToolTip="[Delete]" /> + AutomationProperties.Name="[Info]" + Click="InfoButtonClick" + ToolTipService.ToolTip="[Info]"> @@ -77,28 +85,32 @@ + ToolTipService.ToolTip="[Options]" /> + ToolTipService.ToolTip="[Benchmark]" /> + ToolTipService.ToolTip="[About]" /> + ToolTipService.ToolTip="[More]" />