从父页面启动导航时,如何在UWP页面之间传递参数



我正在使用具有主页的导航模型,该模型包含汉堡菜单和splitView中的myframe。我有两个页面,即工作页面和保存页面,这些页面显示在myFrame中。因此,主页包括以下内容:

<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>

用户单击"保存",这是汉堡菜单中的项目之一(设置为列表框(,并在主页上提高了选择更改的事件,这导致主页启动了从WorkingPage到SavePage in in WorkingPage到SavePage in In Inmyframe。

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 ...
    }
}

Workpage包含一个我希望SavePage可以访问的数据成员。

这就是我所拥有的:

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

我希望传递" myclass"的价值来保存页面,因此最终以:

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

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

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

,问题是主页是启动导航的地方,但是要通过的所需参数值(myClass(仅在工作页面范围中存在。因此,这都要求:

  • a(导航由工作页面启动,以便我可以使用上面的代码行,然后将" SavePage"作为PageClass和" myClass"作为参数,或者将" myClass"作为参数或
  • b(主页需要以某种方式获取" myclass"价值的知识,以便我可以使用与(a(相同的代码行,但使用" this.myframe"而不是" frame"

如何通过从主页开始启动导航事件,从工作页面到保存页面的" myclass"的值如何?这似乎是一个普遍的需求,但是我发现的所有内容都只谈论一个页面的简单情况,将导航启动到另一页,当必须将参数从启动页面传递到另一个页面时。

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

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

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

接下来,您可以通过获取MainPage当前实例来调用您想要的任何页面(在您的情况下是WorkingPage(并调用navigateWithParameter具有适当参数的功能:

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

希望这会有所帮助!

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

MyFrame.Content

因此,在主页上,在事件处理程序中,您可以获取有关显示的页面的引用,然后允许您访问myClass,因为它是公共数据成员。然后,您可以将myClass的值传递到被导航到...的页面上,而无需工作页面,对事件发射有任何了解。

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 ...
    }
}

我有类似的任务。我有一个带有大量设置的UWP页面,分组的按钮和绑定号码框。要搬出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"
                    }
               }
        }

相关内容

  • 没有找到相关文章

最新更新