我有一个WPF应用程序,在文件Main.xaml.cs
中我有以下构造函数:
public MainWindow()
{
InitializeComponent();
Loaded += new RoutedEventHandler(MainWindow_Loaded);
}
来自另一个班级:
In App.xaml.cs
我需要触发一个事件,它将在Main.xaml.cs中运行方法MainWindow_Loaded
知道该怎么做吗?
答案 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的前辈们将其视为终生事件。