在我目前的解决方案中,我有两个项目:
1)包含模型和视图模型以及
的ClassLibrary项目2)一个名为UI的项目,包含2个窗口,一个LoginWindow和一个MainWindow。
目前,UI项目引用了ClassLibrary项目来获取视图模型。当我想将窗口从LoginWindow更改为MainWindow时出现问题。我已经阅读了一些文章并在互联网上搜索了几天,但似乎没有什么比我实际需要的东西更令人满意。通常,它涉及在多个视图之间维护/切换的单个窗口。那不是我想要的。我希望LoginWindow更改为MainWindow并单击按钮关闭LoginWindow。这怎么可以实现?
Edit1:我想我需要澄清我正在使用MVVM并且需要访问适当的视图模型。我不能只是在需要时创建某个窗口的新实例,并在隐藏另一个窗口时显示它。
EDIT2:
public static class MainTest
{
public static int Test()
{
Thread app = new Thread((ThreadStart)delegate
{
LoginWindow login = new LoginWindow();
LoginViewModel loginVM = new LoginViewModel();
if (loginVM.IsLoggedIn == false)
{
return -1;
}
else
{
MainWindow mainWindow = new MainWindow();
mainWindow.Show();
}
}
app.SetApartmentState(ApartmentState.STA);
app.Start();
return 0;
}
}
[已解决]在return -1
我收到错误消息:“匿名函数转换为void返回委托无法返回值”
在app.SetApartmentState(ApartmentState.STA);
我收到错误消息: Argument2:无法从'void'转换为'int'。我认为这与委托有关,你写的在代码的最顶层。
EDIT3:
答案 0 :(得分:0)
我通常使用主类来执行此操作。
创建一个在
中包含此方法的主类public static int Main()
{
Thread app = new Thread((ThreadStart)delegate
{
MyLoginControl login = new MyLoginControl();
MyLoginVM lvm = new MyLoginVM();
login.DataConetxt = lvm;
login.ShowDialog();
if (lvm.IsLoginFailed)
{
return;
}
else
{
MainWindow myApp = new MainWindow();
MyAppVm avm = new MyAppVm();
myApp.DataContext = avm;
myApp.ShowDialog();
}
}
app.SetApartmentState(ApartmentState.STA);
app.Start();
return 0;
}
在项目属性中(在visual studio中右键单击项目 - > gt;属性),在应用程序选项卡中将Main类设置为启动对象
这将允许您运行登录并在启动实际应用程序之前检查结果,而不会在登录视图返回时关闭
编辑:添加了如何使用VM的示例。关键是你可以在这个方法中做你想做的事。它的唯一目的是防止应用程序在登录视图返回时关闭(通常是内部启动Dispose()导致窗口返回时关闭应用程序)
EDIT2 :我的代码中出现了一点错误。固定
答案 1 :(得分:0)
试试这个, 在app.config文件中,将StartupUri xaml定义为login.xaml:
Application x:Class="CapronCRM.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Login.xaml">
在登录xaml中,当登录attemt成功时,请调用此代码:
MainWindow mw = new MainWindow();
mw.Show();
this.Close();