我刚开始学习使用 Xamarin 和 C# 进行编程,但我真的很难回答这个问题。
我有一个主细节应用程序。在我的母版页中,我想轻松添加链接到详细信息页面的按钮。 为此,我想制作一个可以使用两个参数调用的方法: 按钮文本和链接到按钮的详细信息页面。
所以基本上:
public class MainLink : Button
{
public MainLink(string name,string page)
{
Text = name;
Command = new Command(o => {
App.MasterDetailPage.Detail = new NavigationPage(new page);
App.MasterDetailPage.IsPresented = false;
});
}
}
这就是我目前所拥有的。但是行:
App.MasterDetailPage.Detail = new NavigationPage(new page);
当然不行。
当我已经知道页面名称时,如何将字符串转换为页面类型?
最佳答案
您还可以使用 awsome Activator.CreateInstance()
,它接受一个 Type
,这将是您的页面。
为了从 string
到 Type
,您可以做以下两件事之一。要么尝试单独使用 string
获取类型(我实际上没有在 Xamarin Forms 中尝试过),如下所示:
Type somethingPageType = Type.GetType("SomethingPage");
或者您可以将页面 Type
传递到您的 Button
的构造函数中,然后像这样使用它:
....
public MainLink(string name,string page, Type pageType) {
....
}
所以把它们放在一起,要么:
public class MainLink : Button
{
public MainLink(string name,string page)
{
Text = name;
Command = new Command(o => {
Type pageType = Type.GetType(page);
App.MasterDetailPage.Detail = new NavigationPage(Activator.CreateInstance(pageType) as Page);
App.MasterDetailPage.IsPresented = false;
});
}
}
或者:
public class MainLink : Button
{
public MainLink(string name, Type pageType)
{
Text = name;
Command = new Command(o => {
App.MasterDetailPage.Detail = new NavigationPage(Activator.CreateInstance(pageType) as Page);
App.MasterDetailPage.IsPresented = false;
});
}
}
不过要记住两件事。首先是,如果您的页面将参数带入页面的构造函数,您将需要使用 Activator.CreateInstance()
的重载来使其工作。
此外,如果您使用 Xamarin 链接器删除未使用的内容,它可能会弄乱此方法,因此您需要专门告诉链接器不要理会您的反射代码,iOS和 Android
我们不链接所有代码,只链接 SDK 程序集,因此我们不必担心链接器问题,但看起来您可以在 iOS 上使用以下代码来修复它(尽管我没有实际测试过下面的代码) :
在您的 iOS 项目中创建一个名为 whatever 的 .cs
文件(例如 LinkerIncludes.cs
)并添加以下代码:
public class LinkerIncludes {
public void Include() {
var x = new System.ComponentModel.ReferenceConverter (typeof(void));
}
}
关于c# - Xamarin : Open page from string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37774243/