我正在使用具有主页的导航模型,该模型包含汉堡菜单和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"
}
}
}