【发布时间】:2016-06-24 02:43:23
【问题描述】:
我有一个包含 MainPage.xaml 文件的 Windows 10 应用。在该文件中,我保存了基本菜单(hambuger 菜单),并且有这个 Frame 对象允许我在菜单上的选择更改时加载新页面:<Frame Name="MyFrame"></Frame>
所以当ListBox 中的选择发生变化时,有一个非常简单的事件处理程序:MyFrame.Navigate(typeof(WeekPage));
这行代码将Frame 与另一个 XAML 页面一起加载。现在我的问题是,在WeekPage.xaml.cs 内部,我可以控制MyFrame 对象的导航位置吗?
换句话说,我想通过另一个 XAML 文件 (WeekPage.xaml.cs) 的代码隐藏来控制一个 XAML 文件 (MainPage.xaml) 上的 XAML 对象及其属性(按钮、文本块、列表框)。
我已经尝试了以下方法:<Frame Name="MyFrame" x:FieldModifier="Public"></Frame> 这似乎根本没有帮助,并在MainPage.xaml.cs 上设置internal static NAMESPACE.MainPage tried; 和WeekPage.xaml.cs 上的MainPage.tried.MyFrame.Navigate(typeof(StoryPage));(我从here 得到了这个想法)但是当我运行程序时,我得到了一个System.NullReferenceException。
另一个缩小我要查找的范围的示例
有一个 MainPage.xaml 包含应用程序的基本布局(汉堡菜单),这取决于用户在“列表框”中单击的项目以加载新框架,例如:WeekPage.xaml . WeekPage.xaml 有一个GridView,当点击它时,应该用新的帧替换当前帧,并清除MainPage.xaml 中ListBox 上的所有选择。见以下代码:
private void GridView_ItemClick(object sender, ItemClickEventArgs e)
{
// Replacing current frame with new frame
Frame.Navigate(typeof(StoryPage));
// TODO: I need to clear out any selection in the ListBox item in MainPage.xaml
}
【问题讨论】:
-
你为什么要这样做?它只会让其他想要编辑/审查您的代码的人更加困惑。您是否遵循 MVVM 模式?如果是这样,您可以使用属性、命令、触发器和明显的 INotifyPropertyChanged 接口轻松处理这种情况。好吧,如果您想在 xaml.cs 本身中进行控制,那么请尝试考虑创建一个主控件并将 2 个 UserControls 作为子控件放置在该控件中。现在有一个关系,你可以像
Application.Current.MainWindow一样访问父级。 -
我没有固定的方法来解决这个问题,我正在尝试以最好的方式实施解决方案,这就是我发布这个问题的原因。你的提议有点混乱,如果你能提供更多细节来说明你的方法,我将不胜感激。
-
充其量,这个问题太宽泛了。您需要包含一个很好的minimal reproducible example,显示您尝试过的内容,并准确解释您遇到的具体问题。也就是说,正如上面的第一条评论所暗示的那样,您似乎问错了问题。理想情况下,视图(例如页面)甚至不应该访问它们自己,更不用说其他视图了。视图中的元素应该对应于视图models;如果您希望一个视图中的输入影响另一个视图中显示的内容,则应该在两者之间有一个模型来调节它。
-
你能扩展一下那个模型吗?我的“广泛性”是因为我刚刚遇到了这个问题,并且与其他任何事情一样,我必须要求学习。例如,我刚刚了解到,我可以使用
Frame.Navigate(typeof(StoryPage));将当前框架替换为另一个页面,但我仍在寻找如何实现这个允许我控制不同页面之间的 XAML 对象的“模型”。至于问题不准确,老实说,我看不出它更具体,我的例子就在那里,它讨论了框架。如果你愿意,我可以再添加一个。 -
@PeterDuniho 我又添加了一个示例,以帮助您理解我试图通过解释和代码示例完成的特定事情。我希望这可以使讨论变得更具体。如果您对解决此问题有任何想法,请告诉我