首页 > 解决方案 > 在 WPF 中的两个窗口之间同步数据

问题描述

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

有人可以给我一个通用的想法,指出我需要执行上述操作的工具和模式。对于给我的规格,Win2 必须在Win1完成工作后才出现。

尽管应用程序比我现在描述的要复杂,但我想发布一些代码,但我设法混淆了谁在阅读我的想法,所以我告诉你,目前我正在管理内部的窗口App.cs 的构造函数,而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...

}

对我来说最大的问题是将用户数据传递给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 时返回。

标签: c#wpfsynchronization

解决方案


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

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

应用程序.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();

    }
}

赢1

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();
    }
}

推荐阅读