按钮上的更改窗口单击

时间:2017-11-20 16:44:21

标签: c# wpf mvvm

在我目前的解决方案中,我有两个项目:

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:

enter image description here

2 个答案:

答案 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();