63

WPF は独自のMain()メソッドを定義します。Main(通常)WPFを開く独自のメソッドに置き換えるにはどうすればよいですかMainWindow(たとえば、コマンドライン引数を介して非WPFスクリプトモードを追加するには)?

4

5 に答える 5

65

一部の例では、App.xaml の Build Action を からApplicationDefinitionに変更し、クラスをインスタンス化してそのメソッドを呼び出すPage独自のアクションを記述していますが、これにより、App.xaml のアプリケーション全体のリソースの解決に望ましくない結果が生じる可能性があります。Main()AppRun()

Main()代わりに、独自のクラスを独自に作成し、スタートアップ オブジェクトをプロジェクト プロパティでそのクラスに設定することをお勧めします。

public class EntryPoint {
    [STAThread]
    public static void Main(string[] args) {
        if (args != null && args.Length > 0) {
            // ...
        } else {
            var app = new App();
            app.InitializeComponent();
            app.Run();
        }
    }
}

これは、何かが起こる前にサブスクライブする必要があるいくつかのAppDomainイベント ( などAssemblyResolve) を利用するために行います。Page私が経験したApp.xaml を設定することの望ましくない結果にはUserControl、設計時に App.xaml に保持されているリソースを解決しないビュー (MV-VM) が含まれていました。

于 2011-05-27T19:10:20.423 に答える
22

通常App.xaml、このサポートを追加するために編集します。

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

関連する部分は、 からStartupUriStartupイベント ハンドラーを使用して変更しましたApp.xaml.cs。次に例を示します。

/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        int verbose = 0;
        var optionSet = new OptionSet
        {
            { "v|verbose", "verbose output, repeat for more verbosity.",   
                    arg => verbose++ }
        };

        var extra = optionSet.Parse(e.Args);
        var mainWindow = new MainWindow(verbose);
        mainWindow.Show();
    }
}
于 2011-05-27T19:03:01.793 に答える
18

みんな問題は、あなたのプログラムには2つの静的 Main() メソッドがあり、コンパイラがその間で文句を言うことです。これを解決するには、次のいずれかを試してください。

  • 静的な Main() メソッドが実行エントリ ポイントであることをコンパイラに伝えます。プロジェクトの "スタートアップ オブジェクト" 設定を、静的な Main() メソッドを含むクラスに設定します (ソリューション エクスプローラーでプロジェクトを右クリックし、[プロパティ] を選択します)。 」をクリックし、[アプリケーション] タブで [スタートアップ オブジェクト] 設定を探します)。
  • App.g.cs の static Main() メソッドの自動生成をオフにする — ソリューション エクスプローラーで App.xaml を右クリックし、[プロパティ] を選択して、[ビルド アクション] を [ApplicationDefinition] から [Page] に変更します。
于 2014-04-29T10:17:52.250 に答える
4

カスタム静的 Main メソッドを使用して新しいクラスを作成します。このメソッドの最後で、WPF によって生成された元の App.Main() を呼び出すだけです。

public class Program
{
    [STAThread]
    public static void Main(string[] args)
    {
        // Your initialization code
        App.Main();
    }
}

次に、プロジェクトの「スタートアップ オブジェクト」設定を静的な Main() を含むクラスに設定します。

于 2013-02-15T21:41:37.370 に答える
0

カスタム Main() を使用すると、StartupUri が設定されていないために問題が発生する可能性があります。

これを使用して、App クラスで問題なく設定できます (App.xaml から StartupUri を削除し、その Build Action を Page に設定することを忘れないでください)。

[STAThread]
static void Main()
{
    App app = new App();
    app.InitializeComponent();
    app.Run();
}

protected void OnStartup(object sender, StartupEventArgs e)
{
        var toUri = new UriTypeConverter();
        StartupUri = (Uri)toUri.ConvertFrom("MainWindow.xaml");
...
}
于 2015-08-05T14:33:12.367 に答える