[英]Hybrid of console and WPF application. WriteLine to calling console and also allow start of WPF GUI
[英]WPF / Console Hybrid Application
我編寫的應用程序可以在命令行上運行,也可以使用WPF UI運行。
[STAThread]
static void Main(string[] args)
{
// Does magic parse args and sets IsCommandLine to true if flag is present
ParseArgs(args);
if(IsCommandLine)
{
// Write a bunch of things to the console
}
else
{
var app = new App();
app.Run(new Window());
}
}
我將項目的輸出類型設置為控制台應用程序,如果我嘗試通過雙擊exe來執行它,我會彈出一個控制台窗口。 如果未設置標志(通過命令args傳入),我不想向用戶顯示控制台窗口。
但是,如果我將項目的輸出類型設置為Windows應用程序,雙擊行為很好,但是當我在控制台中運行它時,我沒有控制台輸出(Console.Writeline)
你最好的選擇是將實際完成工作的代碼抽象到一個沒有UI的獨立類庫,然后創建兩個應用程序,一個控制台,另一個調用它的WPF。
控制台應用程序和WPF應用程序具有完全不同的應用程序模型,因此您無法在兩個應用程序中重用相同的代碼。
擁有一個單獨的類庫允許您執行其他操作,例如在其他應用程序(如網站或客戶端/服務器體系結構)中使用它。
創建一個WPF應用程序並將以下代碼添加到您的App類:
public partial class App
{
protected override void OnStartup(StartupEventArgs e)
{
if (e.Args.Length > 0)
{
List<string> lowercaseArgs = e.Args.ToList().ConvertAll(x => x.ToLower());
if (AttachConsole(ATTACH_PARENT_PROCESS))
{
// your console app code
Console.Write("\rPress any key to continue...");
Console.ReadKey();
FreeConsole();
}
Shutdown();
}
else
{
base.OnStartup(e);
}
}
private const int ATTACH_PARENT_PROCESS = -1;
[DllImport("kernel32", SetLastError = true)]
private static extern bool AttachConsole(int dwProcessId);
[DllImport("kernel32.dll")]
private static extern bool FreeConsole();
}
您可以通過以下示例執行以下步驟來有條件地啟動WPF應用程序。
在項目的“構建”屬性下,選擇“控制台應用程序”作為輸出,選擇新的“主”方法作為應用程序的“啟動對象”。
using System; public static class Program { [STAThreadAttribute] public static void Main() { Console.WriteLine("What now?"); Console.ReadKey(true); App.Main(); } }
我知道我參加聚會有點晚了,但我覺得我可以投入兩分錢。 您可以始終將其保留為控制台應用程序,然后根據此答案隱藏控制台( https://stackoverflow.com/a/3571628/1059953 )。 有一個控制台顯示的時刻,然后它消失,窗口出現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.