WPF应用程序何时打开主窗口?

4

我第一次使用WPF,创建了一个在VS2013中的默认“App”和“MainWindow”类的示例项目。运行它时,可以很好地加载MainWindow XAML。

当我开始修改原始代码时,我想让Application对象订阅某些MainWindow事件,但是在窗口创建之后才能这样做。我认为在Application类中会有一个事件在处理XAML并创建窗口完成后触发,但到目前为止我还没有找到它。

如果我为Application.StartupApplication.LoadCompleted事件添加处理程序,则它们会在MainWindow创建之前被调用。

今晚我打算阅读关于WPF的资料,但我想在这里提出问题,看看是否有人有建议。


只有在主窗口存在之后,我才能订阅mainwindow上的“Loaded”事件。这是重点... 我需要知道何时创建了mainwindow。 - Mike Fulton
当您收到第一个“Activated”事件时,您可以检查Application.MainWindow属性。如果再次发生Activated,则是因为您的窗口已被停用,然后重新激活。因此,根据您正在执行的操作,决定仅在第一个上执行还是不执行。请参考:https://msdn.microsoft.com/zh-cn/library/system.windows.application.activated(v=vs.110).aspx - Colin Smith
看起来这差不多是我需要的。把它作为答案,我会选择它。谢谢! - Mike Fulton
1个回答

6
有几种方法可以实现您想要做的事情:

1) 等待Application上的Activated事件,然后检查Application.MainWindow

当您收到第一个“Activated”事件时,您可以检查/使用Application.MainWindow属性.....如果再次发生Activated,则是因为您的窗口被取消激活,然后重新激活....因此,根据您正在进行的操作,决定仅在第一次激活或每次激活时执行您的代码。

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

    </Application.Resources>
</Application>

//--------------------------------------------------------

public partial class App : Application
{
    protected override void OnActivated(EventArgs e)
    {
        WireUp(MainWindow as MainWindow);
    }

    public void WireUp(MainWindow mainwindow)
    {
        mainwindow.GotFocus += new RoutedEventHandler(mainwindow_GotFocus);
        mainwindow.LostFocus += new RoutedEventHandler(mainwindow_LostFocus);
        // ...etc...
    }

    void mainwindow_GotFocus(object sender, RoutedEventArgs e)
    {
        // got focus
    }

    void mainwindow_LostFocus(object sender, RoutedEventArgs e)
    {
        // lost focus
    }
}

2) 不要在App.xaml中使用StartupUri, 自己创建MainWindow

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

    </Application.Resources>
</Application>

//--------------------------------------------------------

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

    public void WireUp(MainWindow mainwindow)
    {
        mainwindow.GotFocus += new RoutedEventHandler(mainwindow_GotFocus);
        mainwindow.LostFocus += new RoutedEventHandler(mainwindow_LostFocus);
        // ...etc...
    }

    void mainwindow_GotFocus(object sender, RoutedEventArgs e)
    {
        // got focus
    }

    void mainwindow_LostFocus(object sender, RoutedEventArgs e)
    {
        // lost focus
    }
}

3) 在您的MainWindowLoaded事件中,通过Application.Current单例找到您的App

在处理MainWindow的"Loaded"事件时,访问您在App类中提供的“某些内容”,以连接您感兴趣的事件。缺点是它使您的窗口与App类紧密耦合。

public partial class App : Application
{
    public void WireUp(MainWindow mainwindow)
    {
        mainwindow.GotFocus += new RoutedEventHandler(mainwindow_GotFocus);
        mainwindow.LostFocus += new RoutedEventHandler(mainwindow_LostFocus);
        // ...etc...
    }

    void mainwindow_GotFocus(object sender, RoutedEventArgs e)
    {
        // got focus
    }

    void mainwindow_LostFocus(object sender, RoutedEventArgs e)
    {
        // lost focus
    }
}

//--------------------------------------------------------

public MainWindow()
{
    this.Loaded += MainWindow_Loaded;
}

private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    App app = Application.Current as App;

    app.WireUp(this);
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接