c# - Xamarin : Open page from string

标签 c# xamarin.forms

我刚开始学习使用 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,这将是您的页面。

为了从 stringType,您可以做以下两件事之一。要么尝试单独使用 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 链接器删除未使用的内容,它可能会弄乱此方法,因此您需要专门告诉链接器不要理会您的反射代码,iOSAndroid

我们不链接所有代码,只链接 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/

相关文章:

xamarin.forms - 如何读取本地json文件并显示

c# - 如何在 Xamarin.Forms 中根据 ListView 滚动方向显示和隐藏 StackLayout?

c# - 无法从未打开的数据库创建命令

c# - 使用 ASP.NET Identity 时如何更改表名?

c# - 是否可以将字典从服务器发送到 c# 客户端?

c# - 读取 Cobol 生成的文件

c# - 在 Xamarin forms pcl 项目中使用 HttpUtility

c# - 从字符串生成文件并发送给用户 C#

c# - 使用 sizemode fit 时 MouseEventArgs 位置错误

c# - 我可以将列表移到后面吗?