如何获取其他页面上可用的复杂节点的“列表”

Posted

技术标签:

【中文标题】如何获取其他页面上可用的复杂节点的“列表”【英文标题】:How to get a "list" with complex nodes available on other pages 【发布时间】:2019-12-08 01:39:26 【问题描述】:

我使用 xamarin.forms 并且需要创建一个从 XML 文件中读取的数据的长列表。 (XML 作为“资产”包含在 APK 中)。该列表被读取一次,并应在整个应用程序中使用(只读)。列表包含我正在工作的世界的基础数据。列表的每个节点都有 6 个元素。

我选择将代码放在 MainActivity.cs 中,理由是我可以拥有 全球可用的列表(这似乎是一个不正确的假设)。应用程序读取 XML(每个列表项的所有 6 个数据字段),并且数据很好地到达名为 "_Proben" 的列表中。 我的根本问题是创建的列表在应用程序的其他页面中不可用。 (尝试应用 Singleton 类方法对我不起作用。给出的建议通常不够具体,因为我需要知道我需要在 Xamarin 中的哪个位置嵌入代码以及我需要在哪里“使用”什么。抽象建议没有帮助我,没有占位符的代码最适合我。) 然后我尝试将代码从 MainActivity.cs 移到特定页面“page1.xaml.cs”,目的是至少在该本地环境中创建列表(仍然不是全局的,但至少我可以在那里向下选择)。 我无法让它运行 page1.xaml.cs 中的代码:它不会接受 AssetManager 并给我错误“CS0246 找不到类型或命名空间“AssetManager”... "

我迷路了。

Q1) 我需要做什么才能在 page1.xaml.cs 中运行以下代码? (在 MainActivity.cs 中运行良好的代码)

Q2) 更好:如何使该列表(每个条目有 6 个元素)可全局读取?

public class MainActivity : global::Xamarin.Forms.Platform.android.FormsAppCompatActivity

    // Liste erstellen aller Proben
    public static List<ProbenKlasse> _Proben = new List<ProbenKlasse>();protected override     
    void OnCreate(Bundle savedInstanceState)
    
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;
        base.OnCreate(savedInstanceState);
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        LoadApplication(new App());

        Int16 i = 0;       
        // open the file from the asset folder
        AssetManager assets = this.Assets;
        StreamReader sr = new StreamReader(assets.Open("ProbenDB2.xml"));
        XmlDocument doc = new XmlDocument();
        doc.Load(sr);
        // now initializing the reader 
        XmlNodeReader nodeRead = new XmlNodeReader(doc);
        XmlNodeList xnList = doc.SelectNodes("/ProbenDS/Probe");
        // Beginn reading the XML
        i = 0; // start counting how many data sets were in the XML
        String text1;  // just data containers for the 6 data fields of each entry in the list
        String text2;  // just data containers for the 6 data fields of each entry in the list
        Int16 c1; // just data containers for the 6 data fields of each entry in the list
        Int16 c2; // just data containers for the 6 data fields of each entry in the list
        Int16 c3; // just data containers for the 6 data fields of each entry in the list
        Int16 c4; // just data containers for the 6 data fields of each entry in the list
        foreach (XmlNode xn in xnList)
        
            ProbenKlasse aktprob = new ProbenKlasse(); 
            text1 =              xn["Titel"].InnerText;       aktprob.Titel = text1;
            c1 = Convert.ToInt16(xn["Probentyp"].InnerText);  aktprob.Probentyp = c1;
            c2 = Convert.ToInt16(xn["Wurf1"].InnerText);      aktprob.Wurf1 = c2;
            c3 = Convert.ToInt16(xn["Wurf2"].InnerText);      aktprob.Wurf2 = c3;
            c4 = Convert.ToInt16(xn["Wurf3"].InnerText);      aktprob.Wurf3 = c4;
            text2 =              xn["Beschreibung"].InnerText; aktprob.Beschreibung = text2;
            _Proben.Add(aktprob); // adding the newly read data set to the list
            i = ++i;
        
        GlobalVariables.AnzProben = i;  // letting the app know how many data sets we have

【问题讨论】:

【参考方案1】:

根据你的描述,我猜你是想加载xml文件来获取数据,然后在ContentPage中使用这个数据,对吗?

如果是,我建议你可以在 Xamarin.forms 中使用 DependencyService,

这里是DependencyService,大​​家可以看看:

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/dependency-service/introduction

我做了一个关于使用 DependencyService 将 xml 文件从 Android 获取到 Forms 的示例,你可以看看:

首先,在Forms中创建界面:

public interface IClick


    string GetContent();

内容页面:

private void Button_Clicked(object sender, EventArgs e)
    
        string content = DependencyService.Get<IClick>().GetContent();
    

主活动:

   [assembly: Xamarin.Forms.Dependency(typeof(MainActivity))]
 namespace App3.Droid
 
   [Activity(Label = "App3", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity,IClick

    public string GetContent()
    
        string content="";
        AssetManager asset = Application.Context.Assets;
        using (StreamReader sr = new StreamReader(asset.Open("note.xml")))
        
            content = sr.ReadToEnd();
        
        return content;
    

    protected override void OnCreate(Bundle savedInstanceState)
    
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        base.OnCreate(savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        LoadApplication(new App());
    
  
 

【讨论】:

以上是关于如何获取其他页面上可用的复杂节点的“列表”的主要内容,如果未能解决你的问题,请参考以下文章

如何从日历数据库中获取可用时间段列表

如何获取域创建的所有 cookie 的列表

如何获取 Azure Text To Speech 的可用语音列表?

如何获取系统上可用的所有 Microsoft 媒体基础转换 (MFT) 的列表

Cytoscape js在节点上单击时如何获取所有边缘(文本标签)

Xamarin iOS 如何获取所有可用的 SysSound 列表?