【问题标题】:How to access XAML objects in a different page如何访问不同页面中的 XAML 对象
【发布时间】: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.xamlListBox 上的所有选择。见以下代码:

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 我又添加了一个示例,以帮助您理解我试图通过解释和代码示例完成的特定事情。我希望这可以使讨论变得更具体。如果您对解决此问题有任何想法,请告诉我

标签: c# wpf xaml


【解决方案1】:

如果您不了解 MVVM 方法,请阅读更多信息。在 MVVM 方法中,每个视图都将绑定到一个视图模型。即视图中的数据将绑定到视图模型属性。 例如:假设您有一个文本框,您将它的 Text 属性绑定到其相应视图模型中的 string 属性。

在您的场景中,我们可以有一个由 2 个子视图组成的 MainView。

MainWindow.xaml - MainWindowViewModel
SubView1.xaml - SubView1VM
SubView2.xaml - SubView2VM

MainView 将由 xaml 中的 2 个子视图和主视图模型中的子视图的 2 个视图模型组成。 您还可以在每个子视图模型中使用与按钮单击或任何此类事件相对应的命令。

您可以在 MainWindowViewModel 中处理这些命令。假设在您的视图 2 中,您有一个按钮可以转换到视图 1 并更改视图 1 中的所有文本框值。 处理 MainWindowViewModel 中的按钮命令并从 MainVM 中更改 SubView1VM 属性。

希望您了解 MVVM。使用 MVVM 可以轻松实现您的要求。 MVVM 对编码器更友好,有助于将视图数据与模型分离。

任何想要开始使用 MVVM 的人
https://mva.microsoft.com/en-US/training-courses/building-blocks-universal-windows-platform-16064?l=5V1wM0kDC_2606218949

【讨论】:

  • 感谢您为我提供这个想法。 MVVM 对我来说绝对是新的,但我肯定会研究它以解决我的问题。如果出现任何其他查询,我会将它们发布在此评论线程中。再次感谢!
  • 欢迎。正如@Peter Duniho 所说,您的问题太宽泛而无法回答。无论如何,如果您遇到任何问题,请尝试并恢复。无论如何,如果您对答案感到满意,请随时将其标记为答案,以便将来对其他人有所帮助。
  • 感谢您的提示!我添加了一个小的教程视频 URL 作为对任何发现此问题的人的参考,请接受我的更改以标记为响应。 @ViVi
猜你喜欢
  • 1970-01-01
  • 2015-10-01
  • 2012-10-30
  • 2011-04-13
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
相关资源
最近更新 更多