গীজ, মনে হচ্ছে এখানে প্রচুর কোড চলছে। উপরের স্টাসের ন্যূনতম প্রচেষ্টার জন্য সঠিক পদ্ধতি ছিল। (MVVMLight ব্যবহার কিন্তু স্বীকৃত হওয়া উচিত) এখানে আমার অভিযোজন হচ্ছে ... ওহ এবং PassEventArgsToCommand = "true" হয় স্পষ্টভাবে উপরের হিসাবে উল্লিখিত প্রয়োজন ছিল।
(লরেন্ট Bugnion কৃতিত্ব http://blog.galasoft.ch/archive/2009/10/18/clean-shutdown-in-silverlight-and-wpf-applications.aspx )
... MainWindow Xaml
...
WindowStyle="ThreeDBorderWindow"
WindowStartupLocation="Manual">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Closing">
<cmd:EventToCommand Command="{Binding WindowClosingCommand}" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
ভিউ মডেলে:
///<summary>
/// public RelayCommand<CancelEventArgs> WindowClosingCommand
///</summary>
public RelayCommand<CancelEventArgs> WindowClosingCommand { get; private set; }
...
...
...
// Window Closing
WindowClosingCommand = new RelayCommand<CancelEventArgs>((args) =>
{
ShutdownService.MainWindowClosing(args);
},
(args) => CanShutdown);
শাটডাউন সার্ভিসে
/// <summary>
/// ask the application to shutdown
/// </summary>
public static void MainWindowClosing(CancelEventArgs e)
{
e.Cancel = true; /// CANCEL THE CLOSE - let the shutdown service decide what to do with the shutdown request
RequestShutdown();
}
অনুরোধশুটডাউন নীচের মতো কিছু দেখায় তবে মূলতঃ রিকুয়েস্টশুটডাউন বা যা নামকরণ করা হয় তা অ্যাপ্লিকেশনটি শাটডাউন করবেন কি না (যেভাবেই উইন্ডো বন্ধ করে দেওয়া হবে) সিদ্ধান্ত নেয়:
...
...
...
/// <summary>
/// ask the application to shutdown
/// </summary>
public static void RequestShutdown()
{
// Unless one of the listeners aborted the shutdown, we proceed. If they abort the shutdown, they are responsible for restarting it too.
var shouldAbortShutdown = false;
Logger.InfoFormat("Application starting shutdown at {0}...", DateTime.Now);
var msg = new NotificationMessageAction<bool>(
Notifications.ConfirmShutdown,
shouldAbort => shouldAbortShutdown |= shouldAbort);
// recipients should answer either true or false with msg.execute(true) etc.
Messenger.Default.Send(msg, Notifications.ConfirmShutdown);
if (!shouldAbortShutdown)
{
// This time it is for real
Messenger.Default.Send(new NotificationMessage(Notifications.NotifyShutdown),
Notifications.NotifyShutdown);
Logger.InfoFormat("Application has shutdown at {0}", DateTime.Now);
Application.Current.Shutdown();
}
else
Logger.InfoFormat("Application shutdown aborted at {0}", DateTime.Now);
}
}