C# WPF-我可以将单击事件添加到多个窗口吗?

C# WPF-我可以将单击事件添加到多个窗口吗?,c#,wpf,C#,Wpf,我正在用C语言艰难地完成我的第一个WPF桌面应用程序,并试图通过不重复代码来坚持良好的编程实践。我在尝试向不同窗口中的按钮添加事件处理程序时遇到了一些问题 我有两个名为“MainWindow”和“ViewContent”的窗口,它们都包含退出应用程序的按钮 这两个按钮在XAML中完全相同,并在单独的窗口中创建: <Button Click="Exit_Application" /> 当我在两个窗口的代码隐藏中都包含“Exit_application”方法时,这种方法就起作用了,但我

我正在用C语言艰难地完成我的第一个WPF桌面应用程序,并试图通过不重复代码来坚持良好的编程实践。我在尝试向不同窗口中的按钮添加事件处理程序时遇到了一些问题

我有两个名为“MainWindow”和“ViewContent”的窗口,它们都包含退出应用程序的按钮

这两个按钮在XAML中完全相同,并在单独的窗口中创建:

<Button Click="Exit_Application" />
当我在两个窗口的代码隐藏中都包含“Exit_application”方法时,这种方法就起作用了,但我希望只需要包含一次这个方法,就可以在全局范围内使用它。我到处搜索,似乎找不到关于全局使用单击事件处理程序的任何信息,这可能吗


如果您有任何帮助,我们将不胜感激。

您在按钮上使用单击事件并提出问题,这意味着您不理解wpf中的命令。特别是命令、绑定和资源是使用WPF的最大优点。如果您不使用这些,那么对于一个普通的应用程序来说这是可以的,但是商业团队使用MVVM,甚至是任何物质的爱好应用程序都会从中受益

然而,有一个学习曲线,如果你只编写过一个应用程序,那么学习MVVM可能不值得

无论哪种方式,都可以通过将按钮的command属性绑定到实现icommand的类来使用命令

通常,命令将对数据执行某些操作,您将使用viewmodel,因此一个简单的命令将位于viewmodel的属性中,如:

在这种情况下,您的命令不需要任何数据,只需使用应用程序即可。您可以从任何代码段执行此操作

因此,可以使用实现icommand的静态类。这可以直接在类中实现,也可以通过使用已经为您实现的库实现,就像MVVM light一样

从该线程:

下面是一个简单的实现:

class MyCommand : ICommand
{
    // Singleton for the simple cases, may be replaced with your own factory     
    public static ICommand Instance { get; } = new MyCommand();

    public bool CanExecute(object parameter)
    {
          return true; 
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
         System.Windows.Application.Current.Shutdown();    
    }   

}

您可以在MainWindow或其他类静态ICommand ExitAppCommand中声明并使用它

类别:

public static ICommand ExitAppCommand { get; } = new ActionCommand(() => System.Windows.Application.Current.Shutdown());
XAML:


下面列出了几种处理这种情况的方法,但是我建议您研究一下,以帮助澄清如何构造您的应用程序

一,。应用程序内的共享方法

在项目根目录中的App类(通常是App.xaml.cs)中创建下面的公共方法示例。App类可从应用程序中的任何位置访问,因此可用于共享可从多个应用程序触发的退出逻辑

从每个应用程序中,您可以调用App.Shutdown退出应用程序

二,。确定此情况下不需要代码共享


如果用户退出应用程序时需要运行的唯一代码行是System.Windows.application.Current.Shutdown;那么就没有必要共享此代码。此代码中没有逻辑,因此从两者调用此方法就可以了。

您需要从一个众所周知的设计模式(如MVVM)开始,在学习它的同时寻找原因而不是什么。这将帮助您了解某段代码是否值得重复,以及如何重用。这应该是一个起点。@bit谢谢你的建议,我以前知道MVVM,但从来没有仔细研究过,因为有很多相互冲突的资源。现在我来研究一下。在WPF中,命令不是唯一的方式,而且您的答案缺乏详细的参数,敬请原谅。
<Button Command="{x:Static youClassNamespace:youClass.ExitAppCommand}">
public void Shutdown()
{
    // Insert any code that needs to run before shutdown

    System.Windows.Application.Current.Shutdown();
}