我正在尝试运行一个窗口,关闭它,然后运行第二个窗口,其方式类似于Windows窗体.
namespace WpfApplication1
{
public partial class App : Application
{
[STAThread]
public static void Main()
{
Application app = new Application();
//windowMain.Show();
app.ShutdownMode = ShutdownMode.OnExplicitShutdown;
MainWindow windowMain = new MainWindow();
app.Run(windowMain);
Window1 window1 = new Window1();
window1.Show();
app.Run(window1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已将App.xaml属性中的Build Action从ApplicationDefinition设置为Page,但是当window1初始化时,程序会抛出异常.我究竟做错了什么?
编辑:我已按照第一个答案的建议修改了App.xaml中的xaml,并根据评论建议编辑了main.
<Application x:Class="WpfApplication1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml"
ShutdownMode="OnExplicitShutdown">
<Application.Resources>
</Application.Resources>
</Application>
Run Code Online (Sandbox Code Playgroud)
但我仍然得到例外.
好的,这就是我到目前为止所做的.Solution Builder查找Main()函数.为什么它不是WinMain()函数我仍然没有百分百清楚.如果没有Main(),则会出错.只要项目属性:"应用程序"页面/选项卡:属性:"StartUp Object"设置为指向main()之一,您可以拥有多个Main().这是通过自动创建的下拉列表完成的.
创建"WPF应用程序"项目时,Visual Studio(VS)创建名为"App.xaml"的xaml文件.这是一个类声明,其中"App"派生自"Application"类.VS还会自动为xaml文件生成隐藏文件.创建xaml文件时,它会创建一个"name.gics"文件.它在创建xaml文件后第一次构建项目时创建"name.g.cs"文件.在这种情况下,它会创建"App.g.cs"和"App.gics".默认情况下隐藏这些文件.要查看它们,请按解决方案资源管理器顶部的"显示所有文件"按钮,它们位于"\ obj\86\Debug"文件夹中.删除xaml文件时,"name.gics"和"name.g.cs"文件保留并且不会被删除.
当由VS创建时,"App.xaml"文件的"构建操作"属性设置为"应用程序定义".当此属性设置为"应用程序定义"时,将在"name.gics"中自动创建Main()函数:
[System.STAThreadAttribute()]
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public static void Main()
{
WpfApplication8.App app = new WpfApplication8.App();
app.InitializeComponent();
app.Run();
}
Run Code Online (Sandbox Code Playgroud)
当此属性设置为"Page"时,VS会自动删除Main()函数.您可以在代码或xaml中创建新的"Application"派生类.我还没有找到一个简洁的方法在xaml中做到这一点.似乎没有xaml"Application"派生类的模板.我创建了一个".cs"代码文件,然后将其重命名为.xaml文件.由于某些原因,VS不允许您将多个xaml"应用程序"声明文件设置为"应用程序构建",它甚至不允许您在"项目:属性:应用程序"中选择一个:"启动对象"属性.
正如您在隐藏的Main()中看到的,实例化并运行"App"的实例.如果使用自己的Main()函数:可以声明并运行基本"Application"类或"Application"派生类(无论是在代码中还是在xaml中声明)的实例."Application"类只应实例化一次,并且只能运行一次.如果在xaml中声明了"Application"派生类,则可以使用xaml文件中的StartUpUri属性运行一个简单的应用程序:StartupUri ="Windowname.xaml".或者,顶级UI程序逻辑可以放在Startup事件处理程序中.如果"Startup ="Application_Startup"放在"App.xaml"文件中,则可以编写事件处理程序:
private void Application_Startup(object sender, StartupEventArgs e)
{
MainWindow windowMain = new MainWindow();
windowMain.ShowDialog();
Window1 window1 = new Window1();
window1.ShowDialog();
Shutdown();
}
Run Code Online (Sandbox Code Playgroud)
你必须在这里使用ShowDialog(),因为它会一直阻塞,直到窗口关闭.如果您使用Show(),它将显示一个窗口,然后立即显示另一个窗口并关闭应用程序.在这种情况下,不需要自己调用Run()方法,这是自动完成的.无论是在代码中还是在xaml中声明,"Application"类实例都可以在代码中运行.然后,您可以在调用Run()之前执行初始化代码.这将使用另一种方式放在Application_Startup()事件处理程序中.但是,如果在程序中进行"Application.Run"调用,则不应在Main()或Application Class外部的任何位置或在调用的事件和函数中打开窗口(使用show()或ShowDialog())来自那些在"Application.Run()"期间调用的事件.
Application类具有ShutdownMode属性(Application.ShutdownMode).默认值为:"OnMainWindowClose".此属性也可以在代码或xaml中设置为"OnLastWindowClose"或"OnExplicitShutdown".如果您不希望程序在MainWindow关闭时关闭,则需要重置此项.
我认为,出于我的目的,最好不要使用Application类,只需使用Show()和"ShowDialog()"调用windows.这样我可以使用WPF页面,但我也可以调用Windows Forms或DirectX屏幕,只要它们不是同时打开,或者根本没有UI,如果程序是远程运行的话.有没有理由不这样做?
| 归档时间: |
|
| 查看次数: |
9650 次 |
| 最近记录: |