我正在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时才返回。
答案 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;