如何获取其他页面上可用的复杂节点的“列表”
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());
【讨论】:
以上是关于如何获取其他页面上可用的复杂节点的“列表”的主要内容,如果未能解决你的问题,请参考以下文章
如何获取 Azure Text To Speech 的可用语音列表?
如何获取系统上可用的所有 Microsoft 媒体基础转换 (MFT) 的列表