RichTextBlock生成超链接跳转Frame时的编译错误问题
问题原因分析
这个编译错误“An object reference is required for a non-static field”本质很明确:你大概率是在静态上下文(比如静态方法)里调用了Frame.Navigate,但Frame是实例对象,必须通过具体的实例来调用它的非静态方法——这就是报错的核心原因。而按钮的点击事件处理方法默认是页面类的实例方法,在实例方法里能直接访问当前页面的Frame实例,所以导航能正常执行。
具体解决方案
1. 修正事件处理方法的修饰符
先检查你的超链接点击事件处理方法,确保它是实例方法(去掉static关键字)。正确的方法定义应该是这样:
private void Hyperlink_Click(object sender, RoutedEventArgs e) { // MyFrame是你在XAML中命名的Frame实例,比如x:Name="MyFrame" MyFrame.Navigate(typeof(TargetPage)); }
如果之前不小心给方法加了static,删掉它就好——静态方法属于类本身,无法直接访问类的实例成员(比如你的Frame)。
2. 正确获取Frame实例(针对数据模板场景)
如果超链接是在数据模板里(比如ListView的项模板),直接访问页面的Frame可能会失败,因为数据模板内的控件不在页面的直接命名空间里。这时候可以用两种方式解决:
方法A:通过可视化树查找Frame
private void Hyperlink_Click(object sender, RoutedEventArgs e) { var hyperlink = sender as Hyperlink; if (hyperlink == null) return; // 获取当前窗口,再从中找到Frame实例 var parentWindow = Window.GetWindow(hyperlink); var mainFrame = parentWindow.Content as Frame; mainFrame?.Navigate(typeof(TargetPage)); }
方法B:使用NavigationService
WPF/UWP里的NavigationService可以直接处理导航,不需要直接引用Frame:
private void Hyperlink_Click(object sender, RoutedEventArgs e) { NavigationService.Navigate(typeof(TargetPage)); }
3. 验证Frame的访问权限
确认你在XAML中定义的Frame的x:Name是正确的,并且它的访问修饰符允许当前方法访问(默认是internal,同一个项目里的类都能访问)。
为什么按钮的代码能正常工作?
按钮的点击事件处理方法默认是页面类的实例方法,在实例方法中,你处于当前页面的实例上下文里,可以直接访问页面中的所有实例成员(包括你的Frame),所以不会触发这个错误。
内容的提问来源于stack exchange,提问作者SultanPepper
相关产品推荐
相关产品推荐

