【问题标题】:How to pass a parameter between UWP pages when navigation is initiated from a parent page?从父页面启动导航时,如何在 UWP 页面之间传递参数?
【发布时间】:2018-03-30 05:24:49
【问题描述】:

我正在使用具有 MainPage 的导航模型,其中包含一个汉堡菜单和一个拆分视图中的 MyFrame。我有两个页面,WorkingPage 和 SavePage,它们显示在 MyFrame 中。所以 MainPage 包括这个:

<Page>
    <!-- Other stuff -->

    <SplitView>
        <SplitView.Pane>
            <!-- Other stuff -->

            <ListBox Name="HamburgerMenuMenuItems"
                     SelectionChanged="HamburgerMenuMenuItems_SelectionChanged">

                    <ListBoxItem Name="HamburgerMenuItemSave">
                        <!-- Content -- >
                    </ListBoxItem>
            </ListBox>

            <!-- Other stuff -->
        </SplitView.Pane>

        <SplitView.Content>
            <Frame Name="MyFrame"></Frame>
        </SplitView.Content>
    </SplitView>

    <!-- Other stuff -->
</Page>

用户单击保存,这是汉堡菜单中的一项(设置为列表框),并在 MainPage 上引发选择更改事件,这导致 MainPage 启动从 WorkingPage 到 SavePage 的导航我的框架。

public sealed partial class MainPage : Page
{
    private void HamburgerMenuMenuItems_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        // Other options similar ...
        else if (HamburgerMenuItemSave.IsSelected)
        {
            MyFrame.Navigate(typeof(Pages.File.SavePage));
        }
        // Other options similar ...
    }
}

WorkingPage 包含我希望 SavePage 有权访问的数据成员。

这就是我所拥有的:

public sealed partial class WorkingPage : Page
{
    public MyClass myClass;
    // Other stuff ...
}

我希望将“myClass”的值传递给 SavePage,因此最终结果为:

public sealed partial class SavePage : Page
{
    public MyClass myClass;
    // Other stuff ...
}

我从研究中知道(并且我自己也广泛使用它),在两个页面之间传递参数的正确方法如下:

Frame.Navigate(typeof(PageClass), someParameter);

但是问题是MainPage是启动导航的地方,但是需要传递的参数值(myClass)只存在于WorkingPage的范围内。因此,这需要:

  • A) 导航由WorkingPage发起,这样我就可以使用上面这行代码,只需将“SavePage”作为PageClass和“myClass”作为参数,或者
  • B) MainPage 不知何故需要了解“myClass”的值,以便我可以使用与 (A) 相同的代码行,但使用“this.MyFrame”而不是“Frame”

如何通过从 MainPage 启动的导航事件来完成从 WorkingPage 到 SavePage 的“myClass”值?这似乎是一种常见的需求,但我发现的所有内容都只涉及一个页面启动导航到另一个页面的简单情况,此时必须将参数从启动页面传递到另一个页面。

【问题讨论】:

    标签: c# parameters uwp navigation parameter-passing


    【解决方案1】:

    我很确定这可以通过不同的方式完成。但我个人喜欢使用以下模式来实现这一点:

    首先,在您的MainPage 中,您必须为导航创建一种实用程序 方法:

    public void navigateWithParameter(Page yourPage,String yourParameter){
     MyFrame.Navigate(typeof(yourPage), yourParameter);
    }
    

    接下来,您可以通过获取@987654324 的当前实例,从您想要的任何页面(在您的情况下是WorkingPage)调用此方法@ 并使用适当的参数调用 navigateWithParameter 函数:

    var frame = (Frame)Window.Current.Content;
    var mainpage = (MainPage)frame.Content;
    mainpage.navigateWithParameter(yourPage,"It works!");
    

    希望这会有所帮助!

    【讨论】:

    • 使用这样的实用方法实际上是一个非常酷的想法!但是,仍然需要解决的部分是事件(以及处理程序)正在 MainPage 上发生,但 yourParameter 的参数在 WorkingPage 上。我可以从 MainPage 调用实用程序函数,但它不知道需要传递的参数。
    • 实用函数位于MainPage 中,可以从WorkingPage 或任何其他页面(具有参数知识)调用。您正在传递“有用!” (作为这里的参数)并指定MyFrame(位于MainPage)应该导航到哪个页面。我将编辑我的答案以使其更清楚。
    【解决方案2】:

    通过进一步研究,我找到了解决此问题的方法(可能存在其他方法)。有一个 Frame 的属性可以让您获取对当前显示的页面的引用:

    MyFrame.Content
    

    因此,在 MainPage 上,在事件处理程序中,您可以获得对正在显示的页面的引用,然后允许您访问 MyClass,因为它是公共数据成员。然后,您可以将 MyClass 的值传递到被导航到的页面中……所有这些都无需 WorkingPage 了解事件触发。

    public sealed partial class MainPage : Page
    {
        private void HamburgerMenuMenuItems_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            // Other options similar ...
            else if (HamburgerMenuItemSave.IsSelected)
            {
                // 1. Check if the current page is the correct type
                if (MyFrame.Content is WorkingPage workingPage)
                {
                    // 2. Grab the data to pass from the instance of the displayed page
                    MyClass dataToPass = workingPage.myClass;
    
                    // 3. Pass the grabbed data to the page being navigated to
                    MyFrame.Navigate(typeof(Pages.File.SavePage), dataToPass);
                }
            }
            // Other options similar ...
        }
    }
    

    【讨论】:

      【解决方案3】:

      我有类似的任务。我有一个 UWP 页面,其中包含很多设置、带有绑定 NumberBox 的分组按钮。要离开MainPage,所有按钮处理程序都需要一个“帮助类”。在那里我传递了主页对象,它自动让我可以访问我的MainPage 中的所有元素。

      我的XAML 看起来像:

      <Page> <Grid>
          <StackPanel  >
              <muxc:NumberBox x:Name="Offset" PlaceholderText="0,35"  />
              <Button Content="GrOffset" Click="buttonClickHandler.Offset_Click"   /> 
          </StackPanel>
          <TextBox x:Name="Messager_Container" Text="Total" />
      
      <Grid/>
      <Page/>
      

      C#是

      namespace Eval
            {
                  public sealed partial class MainPage : Page
                  {   /// <summary>
                      /// An empty page that can be used on its own or navigated to within a Frame.
                      /// </summary>
            
                      ButtonClickHandler buttonClickHandler = new ButtonClickHandler();    // create a new instance of our "helper class"
               //===================================    
                      public MainPage()
                      { 
                              this.InitializeComponent();
                              var mainPageVAR = this; // only for check ot, is it valid assigning
                              buttonClickHandler.mainPage = this; //assign to, we pass the addres to our MainPage class instance
                      }
                      public class ButtonClickHandler  // our helping class
                      {
                          public Eval.MainPage mainPage;
                     
                          public void Offset_Click(object sender, RoutedEventArgs e)
                          {     
                              mainPage.Messager_Container.Text= 
                              mainPage.Offset.Value.ToString();
          // our value from numberBox "Offset" passed to TextBox "Messager_Container"
                          }
                     }
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-29
        • 1970-01-01
        • 2016-04-22
        • 1970-01-01
        • 2016-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多