我试图显示一个内容对话框,以确保用户在选择窗口的关闭按钮时确认关闭。但在WinUI3中,我找不到CloseRequested事件。
我尝试使用AppWindow和Hwnd Interop和AppWindow.Closing,但它不工作。在我单击关闭按钮后,没有发生任何事情。
我用的是云母窗,我相信问题一定在这里。
m_closedRevoker = this->Closed(winrt::auto_revoke, [&](IInspectable const&, WindowEventArgs const& e)
{
if (!_closing)
{
_closing = true;
e.Handled(true);
if (have_saved)
{
DispatcherQueue().TryEnqueue([&](auto&& ...)
{
if (nullptr != m_backdropController)
{
m_backdropController.Close();
m_backdropController = nullptr;
}
if (nullptr != m_dispatcherQueueController)
{
m_dispatcherQueueController.ShutdownQueueAsync();
m_dispatcherQueueController = nullptr;
}
Close();
});
}
else
{
winrt::Microsoft::UI::Xaml::Controls::ContentDialog dialog;
dialog.XamlRoot(Content().XamlRoot());
dialog.Title(winrt::box_value(L"Save ?"));
dialog.PrimaryButtonText(L"Yes");
dialog.SecondaryButtonText(L"No");
dialog.CloseButtonText(L"Cancel");
dialog.DefaultButton(winrt::Microsoft::UI::Xaml::Controls::ContentDialogButton::Primary);
dialog.PrimaryButtonClick([&](auto&& ...)
{
if (save_data(winrt::Lexical_Frequency::implementation::amount))
{
DispatcherQueue().TryEnqueue([&](auto&& ...)
{
if (nullptr != m_backdropController)
{
m_backdropController.Close();
m_backdropController = nullptr;
}
if (nullptr != m_dispatcherQueueController)
{
m_dispatcherQueueController.ShutdownQueueAsync();
m_dispatcherQueueController = nullptr;
}
Close();
});
}
});
dialog.SecondaryButtonClick([&](auto&& ...)
{
DispatcherQueue().TryEnqueue([&](auto&& ...)
{
if (nullptr != m_backdropController)
{
m_backdropController.Close();
m_backdropController = nullptr;
}
if (nullptr != m_dispatcherQueueController)
{ m_dispatcherQueueController.ShutdownQueueAsync();
m_dispatcherQueueController = nullptr;
}
Close();
});
});
dialog.ShowAsync().Completed([&](auto&& ...)
{
_closing = false;
});
}
}
});
1条答案
按热度按时间gojuced71#
下面是一个基于Window.Closed event的解决方案,其中包含一个我们可以使用的Handled property:
在主窗口.cpp:
使用主窗口.h:
不管怎样,C#中的等价物是:
注:不需要使用DispatcherQueue.TryEnqueue,但如果不使用DispatcherQueue.TryEnqueue,Close()调用当前会导致WinUI3崩溃...