如何从App.xaml.cs运行MainWindow_Loaded?

时间:2014-06-10 13:47:25

标签: c# .net wpf

我有一个WPF应用程序,在文件Main.xaml.cs中我有以下构造函数:

   public MainWindow()
    {
        InitializeComponent();
        Loaded += new RoutedEventHandler(MainWindow_Loaded);
    }

来自另一个班级:

In App.xaml.cs

我需要触发一个事件,它将在Main.xaml.cs中运行方法MainWindow_Loaded

知道该怎么做吗?

1 个答案:

答案 0 :(得分:2)

您可以通过在App类中手动创建MainWindow来完成此操作。为此,请从App.xaml中删除StartUp属性,使其看起来像这样......

<Application x:Class="Anything.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             >
</Application>

在App.xaml.cs类中,像这样重写OnStartup方法......

  public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            MainWindow mw = new MainWindow();
            mw.Loaded += mw_Loaded;
            mw.Show();
        }
        void mw_Loaded(object sender, RoutedEventArgs e)
        {   // loaded event comes here
            throw new NotImplementedException();
        }
    }

此覆盖手动创建MainWindow并显示它。它还订阅Loaded事件并在mw_Loaded方法中接收通知。您也可以直接调用窗口的方法,因为您有窗口实例。

或者,您可以重载MainWindow构造函数并将其传递给Action委托。它看起来像这样......

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        MainWindow mw = new MainWindow(DoSomething);
        mw.Show();
    }
    public void DoSomething()
    {
    }
}

MainWindow看起来像这样......

public partial class MainWindow
{
    private readonly Action _onLoaded;
    public MainWindow(Action onLoaded)
    {
        _onLoaded = onLoaded;
        InitializeComponent();
        Loaded += MainWindow_Loaded;
    }
    void MainWindow_Loaded(object sender, System.Windows.RoutedEventArgs e)
    {
        _onLoaded();
    }
}

这给你两个选择,还有其他方法,但这些是最权宜之计。正如Sheridan指出的那样,修补一个窗口加载的事件会产生混淆的副作用,比如重新入侵。 WPF的前辈们将其视为终生事件。