在WPF的主窗口网格中,从用户控件打开用户控件。

4
也许我先介绍一下我的应用程序。 例如,当员工登录我的应用程序时,会加载“员工菜单”:
    Dim Empl As New Employee
MainGrid.Children.Add(Empl)
Grid.SetRow(Empl, 1)

这段代码是在Window_Loaded事件中。Menu是User Control,其中有几个按钮可以打开和操作其他用户控件。当我按下例如“Question”按钮时:

Public Class Employee
    Dim mw As New MainWindow
    Private Sub btnQuestionAdd_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnQuestionAdd.Click
        Dim Que As New QuestionAdd
        mw.MainGrid.Children.Add(Que)
        Grid.SetRow(Que, 2)
        Grid.SetColumn(Que, 1)
    End Sub
End Class

我不知道为什么在按钮点击后没有东西加载......难道从其他控件导航主窗口网格很难吗?

你尝试过在btnQuestionAdd_Click方法上设置断点来确保它首先被调用了吗?也许你的事件处理不正确。 - JDB
嗯,Que 是空的。我现在额外做的是 - 我在主窗口上放置了一个按钮,其中包含加载用户控件的代码,并且它可以工作,但在“员工用户控件”中不行... - user2678787
1个回答

1
我猜测您没有提供太多信息,但我注意到以下问题可能是罪魁祸首。
在您的第一个代码片段中,似乎是从 MainForm 创建了 employee:
Dim Empl As New Employee
MainGrid.Children.Add(Empl)
Grid.SetRow(Empl, 1)

你的下一个评论似乎证实了这个假设:

这是从Window_Loaded事件中来的。菜单是用户控件,在那里我有一些按钮来打开和操作另一个用户控件。当我按下例如“问题”按钮时

然而,在你的Employee类中,你正在创建一个全新的MainWindow实例,然后向其添加数据:
Public Class Employee
    Dim mw As New MainWindow
    Private Sub btnQuestionAdd_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnQuestionAdd.Click
        Dim Que As New QuestionAdd
        mw.MainGrid.Children.Add(Que)
        Grid.SetRow(Que, 2)
        Grid.SetColumn(Que, 1)
    End Sub
End Class

如果这个观察是正确的,那么我认为你需要回到书本上去理解 实例 的概念。 实质上,你创建了第二个表单(因为你从未明确地显示它),然后修改了这个第二个表单而不是原始表单。为了证明这个假设,尝试添加以下代码行:
Public Class Employee
    Dim mw As New MainWindow
    Private Sub btnQuestionAdd_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnQuestionAdd.Click
        Dim Que As New QuestionAdd
        mw.MainGrid.Children.Add(Que)
        Grid.SetRow(Que, 2)
        Grid.SetColumn(Que, 1)
        mw.Show() ' <---
    End Sub
End Class

你很可能会看到第二个表单弹出,其中包含你在第一个表单上所期望的所有更改。
至于如何解决这个问题,最简单的方法是在初始化程序(“Sub New”)中添加一个参数,该参数接受主窗体作为值。然后,你可以将该值分配给一个字段或属性(可能只是你的mw字段),并继续进行下去。不过,这将会在今后给你带来麻烦,因此现在是一个好时机来开始学习更多关于软件架构的知识,特别是关注点分离的概念。

那么你好,Cyborgx37! 我所做的是: Dim mw As MainWindow = DirectCast(Application.Current.MainWindow, MainWindow) 因为我正在引用非共享成员。 - user2678787

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接