【问题标题】:Accessing SplitView control from a different page than it's host - C# XAML Windows 10 UWP从与其主机不同的页面访问 SplitView 控件 - C# XAML Windows 10 UWP
【发布时间】:2015-10-23 12:25:17
【问题描述】:

预先警告,我是 C# 和 XAML 的新手,但我真的很喜欢 Windows 10 UWP 应用。我有一个关于如何正确处理 SplitView 的问题。

我有一个主页,其中有一个 SplitView 控件。在 SplitView 内容中,我添加了一个框架,用于导航到其他页面。我想在子页面上添加汉堡按钮以在主页上打开 SplitView,但我无法从子页面访问 SplitView 控件。如何使 SplitView 控件可访问,以便子页面中的汉堡按钮可以打开 SplitView 窗格?

另一种方法是在主页中添加一个标题并在那里有一个静态汉堡按钮,但我不喜欢这个选项,因为它使处理文本标题内容更加困难。另一种是将SplitView复制到每个页面。我也不想这样做。

任何建议都会很棒!谢谢。

【问题讨论】:

    标签: c# windows xaml splitview uwp


    【解决方案1】:

    我强烈建议您选择在主页中包含汉堡包按钮的替代选项。用户总是希望它每次都在同一个位置,改变这种方法可能会导致糟糕的用户体验。

    您也不想重复代码,因此您不想在每个页面上重新创建按钮以及打开/关闭命令等​​任何附加功能。

    与其将元素从一个页面引用到另一个页面,更好的做法是保持事物松散耦合。这可以通过一个信使插件来完成,该插件将一个事件从一个页面发送到另一个页面,它可以给出你想要做什么的指示。这样其他页面只需要监听事件而不是持有强引用。为了简化此过程中的某些过程,您可以从实现信使功能的基类继承。

    这将为您的按钮和标题文本情况提供解决方案,但设置它们超出了此问题的范围。根据您的应用程序的大小和您的目标,您可能希望研究有助于设计可维护应用程序的现有框架。我建议检查的一个好的 Mvvm 框架是 MvvmCross,它也跨平台并包含一个 messenger plugin

    祝你的应用好运。

    【讨论】:

      【解决方案2】:

      如上所述,出于几个原因,最好将汉堡包按钮保留在主​​页中。一是上面提到的一致性。其次,您必须在每个内容页面中重新创建汉堡包按钮,而不是在 MainPage.xaml 中只创建一次。此外,请记住,SplitView 菜单在弹出和弹出以及显示方式方面存在不同类型的交互,所有这些都在下面列出。

      内联 - 当菜单窗格打开时,它会将内容推送过来。关闭后,内容会回到原来的位置

      叠加 – 打开菜单窗格时,它位于内容的顶部。当它关闭时,它是不可见的。

      Compact Overlay – 当菜单窗格打开时,它位于内容的顶部。当它关闭时,该窗格在紧凑模式下仍然可见。

      Compact Inline – 当菜单窗格打开时,它会将内容推送过来。当它关闭时,内容会回到原来的位置,但在紧凑模式下窗格仍然可见。

      您还可以在此处快速了解 SplitView。 http://jamesqquick.com/windows-10-splitview-intro/

      【讨论】:

        【解决方案3】:

        我找到了解决方案:

        在 MainPage 中,在您的 SplitView 窗格按钮方法中,添加一个 SplitView 引用作为 Navigate() 中的参数:

        private void SlitViewPaneButton_Tapped(object sender, TappedRoutedEventArgs e)
            {
                var frame = contentFrame;
                Page page = frame?.Content as Page;
                if (page?.GetType() != typeof(ChildPage))
                {              
                    frame.Navigate(typeof(ChildPage), SplitViewName);
                }
            }
        

        在您的 ChildPage.xaml.cs 中:

        protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                 SplitView sv = new SplitView();
                 sv = e.Parameter as NavigateControls;
            }
        

        您现在可以在 ChildFrame 代码中执行 sv.IsPaneOpen = false。

        注意:如果要传递多个控件,请创建一个类,将这些控件作为变量,并使用实例作为参数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-25
          相关资源
          最近更新 更多