WPF VB.NET:如何通过Page1按钮使用主窗口Frame导航至Page2
嘿,我懂你遇到的问题了——你想在Page1的按钮点击时,复用主窗口里的Frame导航到Page2,而不是在Page里新建一个Frame对吧?直接写MainWindow.Frame.Navigate(...)行不通,是因为你这里引用的是MainWindow这个类,而不是当前正在运行的主窗口的实例。下面给你几个实用的解决办法:
方法1:通过Window.GetWindow获取主窗口实例(简单直接)
这个方法适合小型项目,直接在Page1的按钮事件里拿到当前的主窗口实例,然后调用它的Frame导航:
首先,记得把MainWindow里的Frame控件的访问修饰符改成Public(在XAML里可以设置x:FieldModifier="Public",或者在属性面板里找Modifiers选项改成Public)。
然后在Page1的按钮点击事件里写:
Private Sub Btn1_Click(sender As Object, e As RoutedEventArgs) Handles btn.Click ' 获取当前页面所属的主窗口实例 Dim mainWindow = TryCast(Window.GetWindow(Me), MainWindow) If mainWindow IsNot Nothing Then ' 调用主窗口的Frame导航到Page2 mainWindow.Frame.Navigate(New Page2()) End If End Sub
Window.GetWindow(Me)会返回承载当前Page的窗口,我们把它转换成MainWindow类型,之后就能访问它的Frame了。
方法2:用事件传递解耦(推荐大型项目)
如果不想让Page1直接依赖MainWindow(降低耦合度,方便后续维护),可以在Page1里定义一个事件,让MainWindow订阅这个事件,当按钮点击时触发事件,由MainWindow自己处理导航逻辑:
第一步:在Page1里定义事件
' 在Page1的类里定义一个事件 Public Event NavigateToPage2 As EventHandler Private Sub Btn1_Click(sender As Object, e As RoutedEventArgs) Handles btn.Click ' 按钮点击时触发事件 RaiseEvent NavigateToPage2(Me, EventArgs.Empty) End Sub
第二步:在MainWindow里订阅事件
当你在MainWindow里导航到Page1的时候,订阅这个事件:
Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded Dim page1Instance = New Page1() ' 订阅Page1的导航事件 AddHandler page1Instance.NavigateToPage2, AddressOf HandleNavigateToPage2 ' 导航到Page1 Frame.Navigate(page1Instance) End Sub ' 处理导航事件的方法 Private Sub HandleNavigateToPage2(sender As Object, e As EventArgs) ' 用主窗口的Frame导航到Page2 Frame.Navigate(New Page2()) End Sub
这个方式下,Page1不需要知道MainWindow的存在,只负责触发“要导航到Page2”的信号,导航逻辑完全由MainWindow控制,更符合面向对象的设计原则。
小提示
不管用哪种方法,都要确保MainWindow里的Frame控件不是私有访问权限,否则即使拿到了MainWindow实例,也访问不到Frame哦!
内容的提问来源于stack exchange,提问作者Aousaf Rashid

