После небольшой копки я обнаружил, что подтверждение закрытия приложения на самом деле является ограниченной возможностью , которую вы должны объявить в манифесте приложения. Щелкните правой кнопкой мыши файл Package.appxmanifest
в Solution Explorer и выберите Просмотреть код .
В открывшемся XML-файле сначала добавьте следующее пространство имен в корневой элемент Package
:
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
А теперь найдите раздел Capabilities
, в который вы добавляете возможность confirmAppClose
:
<Capabilities>
<Capability Name="internetClient" />
<rescap:Capability Name="confirmAppClose" />
</Capabilities>
Также помните, что если вы хотите отобразить MessageDialog
, вам придется использовать отсрочку, чтобы система ожидала завершения await
, прежде чем проверять свойство Handled
:
var deferral = e.GetDeferral();
var dialog = new MessageDialog("Are you sure you want to exit?", "Exit");
var confirmCommand = new UICommand("Yes");
var cancelCommand = new UICommand("No");
dialog.Commands.Add( confirmCommand);
dialog.Commands.Add(cancelCommand);
dialog.CancelCommandIndex = 1;
dialog.DefaultCommandIndex = 1;
if (await dialog.ShowAsync() == cancelCommand)
{
//cancel close by handling the event
e.Handled = true;
}
deferral.Complete();
Преимущество этого подхода по сравнению с простым завершением приложения вручную и установкой события как Handled
каждый раз в том, что в этом случае приложение сначала проходит через событие времени жизни приостановки, что позволяет сохранять любые несохраненные изменения, тогда как Например, Application.Terminate()
будет означать немедленное «жесткое уничтожение» приложения.