在WPF中启动应用程序,如何不使用启动uri,而是使用窗口实例

问题描述 投票:0回答:3

我在一家商店工作,该商店已将 MVC 的影响融入到 WPF\MVVM 范例中。在这个领域中,首先更新控制器,这将更新它的视图和视图模型(通过 MEF)。

我想知道如何进入 app.xaml.cs 来为其提供一个创建的窗口(及其依赖项)而不是 StartUpUri。我仍然需要全球资源来工作。

c# wpf mvvm
3个回答
3
投票

WPF 应用程序的默认项目模板假定您希望主应用程序类基于 xaml。但是,这不是必需的,您可以更改它。这样做允许您编写自己的应用程序入口点方法并创建按照您想要的方式配置的自己的应用程序实例。

因此,您可以删除 App.xaml 和 App.xaml.cs 文件,并在其位置创建 App.cs 文件。在该文件中,执行如下操作:

internal class App : Application
{
    [STAThread]
    public static int Main(string[] args)
    {
        App app = new App();
        // Setup your application as you want before running it
        return app.Run(new MainWindow());
    }

    public App()
    {
        // (Optional) Load your application resources file (which has a "Page" build action, not "ApplicationDefinition",
        // and a root node of type "ResourceDictionary", not "Application")
        Resources = (ResourceDictionary)Application.LoadComponent(new Uri("/MyAssemblyName;component/Resources.xaml", UriKind.Relative));
    }
}

这允许您在运行应用程序之前以您想要的方式指定主窗口。您的应用程序资源文件将如下所示:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <!-- Put application resources here -->
</ResourceDictionary>

我总是以这种方式构建我的 WPF 应用程序,因为它看起来更简单,并且可以更好地控制应用程序的运行方式。 (我在 Visual Studio 中创建了一个自定义 WPF 应用程序项目模板。)


2
投票

在 app.xaml 文件中添加 Startup 事件,如下所示:

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

    </Application.Resources>
</Application>

然后,在app.xaml.cs文件中,处理事件并打开窗口:

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        Test.MainWindow window = new MainWindow();            
        window.Show();
    }

我不知道这是否会损害 MVVM 设计。


0
投票

为了完整起见,我将补充一点,您甚至不需要在

Application
类中启动应用程序。您可以删除整个
App.xaml
App.xaml.cs
,只要您在某处有
Main
方法,项目就会编译。

如果有更合适的

Main
方法,您可以在项目的属性中设置
<StartupObject>

XXX.cs

using System.Windows;

namespace myNamespace;

public class XXX {

    [STAThread]
    public static int Main() {
        var app = new Application();
        return app.Run(new MainWindow());
    }
}

public class YYY {
    public static int Main() {
        return 0;
    }
}

项目.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net8.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UseWPF>true</UseWPF>
        <StartupObject>myNamespace.XXX</StartupObject>
  </PropertyGroup>
    ...
</Project>
© www.soinside.com 2019 - 2024. All rights reserved.