我正在尝试使用this github示例的帮助进行主 - 细节导航。我项目中的相关代码示例是 -
MasterPageItem.cs
namespace Demo.MenuItems
{
public class MasterPageItem
{
public string Title { get; set; }
public string IconSource { get; set; }
public Type TargetType { get; set; }
}
}
MainPage.xaml.cs中
public partial class MainPage : MasterDetailPage
{
public MainPage()
{
InitializeComponent();
masterPage.ListView.ItemSelected += OnItemSelected;
if (Device.RuntimePlatform == Device.UWP)
{
MasterBehavior = MasterBehavior.Popover;
}
Detail = new NavigationPage(new HomePage());
}
void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
{
var item = e.SelectedItem as MasterPageItem;
if (item != null)
{
Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));
masterPage.ListView.SelectedItem = null;
IsPresented = false;
}
}
}
MasterPage.Xaml.cs
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class MasterPage : ContentPage
{
public ListView ListView { get { return listView; } }
public MasterPage()
{
InitializeComponent();
var masterPageItems = new List<MasterPageItem>();
masterPageItems.Add(new MasterPageItem
{
Title = "Help",
IconSource = "icon-1.jpg",
TargetType = typeof(WebPage)
});
listView.ItemsSource = masterPageItems;
}
}
如果没有数据需要传递到详细信息页面,它就可以工作。但是,我需要在页面url
中传递一个字符串值WebPage
,但我无法弄清楚如何传递字符串值或后续行中的任何数据 -
Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));
例如,以下是页面WebPage
-
public WebPage (string URL)
{
InitializeComponent ();
Browser.Source = URL;
}
我在这里无法弄清楚,我应该如何从Master-Detail Navigation中传递url
?
答案 0 :(得分:3)
广义方式:
//This will create instance of the page using the parameterized constructor you defined in each DetailPages
Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType, myStringParam));
//Your Each Detail Page should have parametrized constructor.
public MyPage (string param)
{
InitializeComponent ();
Browser.Source = param;
}
在这里,您可以序列化c#对象并将JSON字符串传递给myStringParam。您的页面在您定义的页面参数化构造函数中接收到此页面,您可以在其中反序列化,因此您可以将复杂对象作为JSON传递到页面以及简单字符串中。
如果您只想在一个DetailPage中添加参数化构造函数,那么:
if(item.TargetType == typeof(WebPage))
{
Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType, myStringParam));
}
else
{
Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));
}
//Your Page would be:
public WebPage (string URL)
{
InitializeComponent ();
Browser.Source = URL;
}
答案 1 :(得分:1)
是的,你可以Activator.CreateInstance
方法尽可能多的重载
Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType, url));
所有重载都可以在这里找到
Activator.CreateInstance Method
你想要的就是这里
Activator.CreateInstance Method (Type, Object[])
参数
类型类型:System.Type
要创建的对象类型
args类型:System.Object []
数量匹配的参数数组, order,并键入要调用的构造函数的参数。如果args 是一个空数组或null,不带参数的构造函数 (默认构造函数)是调用