You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:04:08