在WPF中在两个Window之间同步数据

时间:2018-07-03 14:09:32

标签: c# wpf synchronization

我正在WPF中开发一个应用程序。我需要加载用于填充表单的Window类的实例(在这里我称为 Win1 )。然后,单击“提交”按钮时, Win1 关闭,然后才可以加载新的 Win2 窗口(另一个类,也从Window继承)。问题是它们都打开,并且我无法同步从第一个 Win1 获得的数据并将它们传递给第二个 Win2 。我只是搞砸了。

有人可以给我一个笼统的想法,指出我要做上述工作所需的工具和模式。对于给我的规范,只有在 Win1 完成其工作之后,才出现 Win2

尽管该应用程序比我现在描述的要复杂,但我想发布一些代码,但是我设法混淆了谁在读我的想法,所以我告诉你,目前我正在管理App.cs的构造函数中的Windows,而 MainWindow.cs 对应于 Win2 ,我创建了一个新类来实现 Win1

public partial class App : Application
{
   // Params...

   public App()
   {
       Client = LoadNetwork();
       User = LoadUser(Client); // Shows Win1
       Games = LoadMinigames();
       mainWindow = new MainWindow(User, Games);
       Application.Current.MainWindow = mainWindow; // On XAML default is Hidden
       mainWindow.Show(); // Shows Win2
   }

   // Other methods...

}

对我来说,最大的问题是将 User 数据传递给 MainWindow ,而且我对如何处理这种情况并不了解。


  

更新

public partial class MainWindow : Window
{
    public UserLoading ul;
    public UserRegistering ur;
    public User.UserProfile User;
    private List<Game.Game> Games;
    public Label Username;

    public MainWindow(User.UserProfile user, List<Game.Game> games)
    {
        User = new UserProfile();
        InitializeComponent();
        User = user;
        Games = games;
        Username.Content = User.Username;

        DrawList(Games);
    }

    //...

}

我意识到我已经对自己做了一些解释,“我多次重复阅读我的问题。因此,我通过在此处报告对其中一项评论的回答来试图使其更加清晰。

  

UserLoad方法不会阻塞,因为它内部是实例化的类,这些类继承了Window(其他用于登录和注册的窗口),然后执行流程继续并实例化MainWindow,其中“ user”参数自然会返回null因为表格尚未填写。现在我意识到,也许我对自己的解释很不好。 Win1的调用没有阻塞,我希望它仅在准备好将用户数据作为参数传递给Win2时才返回。

2 个答案:

答案 0 :(得分:0)

我过去曾经这样做过。这是我的解决方案:

将启动窗口设置为Win1。让它启动。在App.cs中创建一个静态方法以启动Win2。当Win1可以关闭并且您想要Win2打开时,请从Win1内部调用App.ShowMainWindow(this)。

App.cs

public partial class App : Application
{

    static internal void ShowWin2(Win1 win1)
    {
        Win2 win2 = new Win2();
        // Copy Win1 stuff to Win2 here
        Application.Current.MainWindow = win2;
        win2.Show();

    }
}

Win1

public partial class Win1 : Window
{
    public Win1()
    {
        InitializeComponent();
    }

    private void CloseAndLaunchWin2()
    {
        App.ShowWin2(this);
        this.Close();

    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        CloseAndLaunchWin2();
    }
}

答案 1 :(得分:0)

正如Nawed用户所说,您应该阅读MVVM。可以通过对两个不同的视图使用相同的模型来实现同步。

您可以这样做。

var sharedContext = new MyViewModel();

var viewOne = new MyWindow();
var viewTwo = new MyUserControl();

viewOne.DataContext = viewTwo.DataContext =  sharedContext;