我如何知道WPF应用程序何时打开主窗口?

时间:2015-03-24 01:56:15

标签: wpf windows

我第一次玩WPF。我在VS2013中创建了一个带有默认“App”和“MainWindow”类的示例项目。当我运行它时,它会加载 MainWindow XAML就好了。

当我开始修改原始代码时,我想让应用程序对象订阅 MainWindow 的某些事件,但是你不能这样做直到窗口已创建。我认为在应用程序类中会有一个事件在处理完XAML和创建窗口时会触发,但到目前为止我还没有找到它。

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

我今晚要花点时间阅读WPF,但我想我会在这里提出问题,看看是否有人有建议。

1 个答案:

答案 0 :(得分:4)

有几种方法可以实现您的目标:

1)等待Activated上的Application事件,然后检查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)在您Loaded的{​​{1}}事件中,通过MainWindow单身人士

找到您的App

在处理&#34; Loaded&#34;您Application.Current上的活动,访问&#34;某事&#34;您在MainWindow课程中提供了您感兴趣的事件。下行是让您的窗口与您的App类紧密耦合。

App