WPF は独自のMain()
メソッドを定義します。Main
(通常)WPFを開く独自のメソッドに置き換えるにはどうすればよいですかMainWindow
(たとえば、コマンドライン引数を介して非WPFスクリプトモードを追加するには)?
5 に答える
一部の例では、App.xaml の Build Action を からApplicationDefinition
に変更し、クラスをインスタンス化してそのメソッドを呼び出すPage
独自のアクションを記述していますが、これにより、App.xaml のアプリケーション全体のリソースの解決に望ましくない結果が生じる可能性があります。Main()
App
Run()
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) が含まれていました。
通常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">
関連する部分は、 からStartupUri
にStartup
イベント ハンドラーを使用して変更しました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();
}
}
みんな問題は、あなたのプログラムには2つの静的 Main() メソッドがあり、コンパイラがその間で文句を言うことです。これを解決するには、次のいずれかを試してください。
- 静的な Main() メソッドが実行エントリ ポイントであることをコンパイラに伝えます。プロジェクトの "スタートアップ オブジェクト" 設定を、静的な Main() メソッドを含むクラスに設定します (ソリューション エクスプローラーでプロジェクトを右クリックし、[プロパティ] を選択します)。 」をクリックし、[アプリケーション] タブで [スタートアップ オブジェクト] 設定を探します)。
- App.g.cs の static Main() メソッドの自動生成をオフにする — ソリューション エクスプローラーで App.xaml を右クリックし、[プロパティ] を選択して、[ビルド アクション] を [ApplicationDefinition] から [Page] に変更します。
カスタム静的 Main メソッドを使用して新しいクラスを作成します。このメソッドの最後で、WPF によって生成された元の App.Main() を呼び出すだけです。
public class Program
{
[STAThread]
public static void Main(string[] args)
{
// Your initialization code
App.Main();
}
}
次に、プロジェクトの「スタートアップ オブジェクト」設定を静的な Main() を含むクラスに設定します。
カスタム 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");
...
}