C# 如何在特定条件下仅防火窗关闭事件?

C# 如何在特定条件下仅防火窗关闭事件?,c#,wpf,C#,Wpf,我一直在寻找答案,但似乎我没有找到一个明确的答案,或者我把每一个问题都看过头了。 Im正在读取命令行参数,其中一个参数确定是否应保存最后一个窗口状态。如果用户输入参数,我将关闭事件订阅到我的主窗口 在另一类中: if(saveSettings.Equals("Sw") || saveSettings.Equals("SW") || saveSettings.Equals("sw")) { Main.Closing += Main

我一直在寻找答案,但似乎我没有找到一个明确的答案,或者我把每一个问题都看过头了。 Im正在读取命令行参数,其中一个参数确定是否应保存最后一个窗口状态。如果用户输入参数,我将关闭事件订阅到我的主窗口

在另一类中:

if(saveSettings.Equals("Sw") || saveSettings.Equals("SW") || saveSettings.Equals("sw"))
{
    Main.Closing += Main.Window_Closing_1;
}
活动:

public void Window_Closing_1(object sender, CancelEventArgs e)
{

    SaveWindowState newWindowwState = new SaveWindowState();

    newWindowwState.WindowHeight = this.Height;
    newWindowwState.WindowWidth = this.Width;
    newWindowwState.WindowTop = this.Top;
    newWindowwState.WindowLeft = this.Left;
    newWindowwState.State = this.WindowState;

    newWindowwState.Save();
如何确保仅在满足上述条件时执行此事件?我对wpf比较陌生,所以我对事件的了解相当薄弱

“如何在特定条件下仅关闭防火窗。关闭事件?”

只有事件源可以控制如何引发事件。在此类之外,您只能处理事件。
在您的情况下,
Window.Closing
仅在
窗口
即将关闭时引发一次。您可以通过注册事件处理程序来处理它,例如,
Window\u Closing\u 1
或通过不注册或取消注册事件处理程序来忽略它。但是不管你怎么选择,这项活动都会被提出

“如何确保仅在上述条件下执行此事件 我们见过面吗?”

如前所述,您无法控制何时或是否引发事件。但您可以控制是否调用事件处理程序(回调)

您当前的代码已经完成了您想要的操作,因为条件在运行时不会改变:当条件的计算结果为
true
时,您当前只在侦听
关闭
事件。因为只有这样才能注册
窗口关闭\u 1
事件处理程序

另一种解决方案是始终侦听事件,并在事件处理程序内部决定是否执行该处理程序。当条件在运行时发生变化时,这一点尤其有用:

public Constructor()
{
    Main.Closing += Main.Window_Closing_1;
}

public void Window_Closing_1(object sender, CancelEventArgs e)
{
    if (!saveSettings.Equals("sw", StringComparison.OrdinalIgnoreCase))
    {
        // Condition failed --> don't handle
        return;
    }


    SaveWindowState newWindowwState = new SaveWindowState();

    newWindowwState.WindowHeight = this.Height;
    newWindowwState.WindowWidth = this.Width;
    newWindowwState.WindowTop = this.Top;
    newWindowwState.WindowLeft = this.Left;
    newWindowwState.State = this.WindowState;

    newWindowwState.Save();
}

只要条件是静态的,两个版本都同样“好”。我建议这样读:。

为什么不在关闭时简单地检查条件?事件处理程序只有在您之前将其附加到事件时才会执行。除此之外,三个字符串的比较是多余的。只需调用
saveSettings.Equals(“sw”,StringComparison.OrdinalIgnoreCase)
@Clemens:要学究气。这将允许使用“sW”,但它不在他当前的代码中。@Ralf确实如此。。。可能是她的密码。更好的“他们的”。你只需在第一次通话后取消订阅即可。但我不喜欢订阅的想法,而是使用重置的
bool
属性。谢谢您的详细回答。更好地了解事件并处理它们!