如何根据XML页面动态地采用不同的用户输入来构建内容页面

时间:2019-01-03 16:44:20

标签: xamarin xamarin.forms

我正在Xamarin中构建一个APP。这个想法是我的用户需要向服务器发送请求以执行一些工作。服务器的服务作为Web服务公开。我可以从不同的Web服务检索XML。

我想为用户建立一个接口,以填写Web服务成功接受呼叫所需的输入。

我已经能够使用ListView生成可用服务的列表。

        items = new List<Item>();
        String htmlCode = client.DownloadString("http://localhost:8181/ws/");
        String BusinessObjectStr;
        BusinessObjectStr = htmlCode.Substring(htmlCode.IndexOf("<b>"));

        String[] BusinessObjectList = Regex.Split(BusinessObjectStr, "<b>");
        foreach (string item in BusinessObjectList)
        {
            if (item.Length > 0)
            {
                string tempDesc = item.Substring(item.IndexOf("</b>") + 7, item.IndexOf("<br>"));
                tempDesc = tempDesc.Substring(0,tempDesc.IndexOf("<br>"));
                items.Add(new Item { Id = Guid.NewGuid().ToString(), Text = item.Substring(0, item.IndexOf("</b>")), Description = tempDesc});
            }
        }

我的下一个难题是要获得每种可用的服务,我需要接受不同的投入。我无法使用ListView进行工作,而是查看了TableView。 TableView可以给我结果,但是,这是静态的,因为我需要预先定义它。

        <TableView>
        <TableRoot>
            <TableSection Title="{Binding Header1}">
                <EntryCell Label="{Binding Value2}" Placeholder="default" />
                <EntryCell Label="{Binding Value3}" Placeholder="omg brb ttyl gtg lol" Keyboard="Chat" />
                <EntryCell Label="{Binding Value4}" Placeholder="sales@xamarin.com" Keyboard="Email" />
                <EntryCell Label="{Binding Value5}" Placeholder="55" Keyboard="Numeric" />

Webservice XML的结构如下:

   <wsdl:message name="InitialiseRequest"/>
   <wsdl:message name="InitialiseResponse">
       <wsdl:part name="Instance" type="s:string"/>
   </wsdl:message>
   <wsdl:message name="CleanUpRequest">
       <wsdl:part name="Instance" type="s:string"/>
   </wsdl:message>
   <wsdl:message name="CleanUpResponse"/>
   <wsdl:message name="AddNumbersRequest">
       <wsdl:part name="Instance" type="s:string"/>
       <wsdl:part name="Value1" type="s:decimal"/>
       <wsdl:part name="Value2" type="s:decimal"/>
   </wsdl:message>
   <wsdl:message name="AddNumbersResponse">
       <wsdl:part name="Result" type="s:decimal"/>
   </wsdl:message>
   <wsdl:message name="SubtractNumbersRequest">
       <wsdl:part name="Instance" type="s:string"/>
       <wsdl:part name="Value1" type="s:decimal"/>
       <wsdl:part name="Value2" type="s:decimal"/>
   </wsdl:message>
   <wsdl:message name="SubtractNumbersResponse">
       <wsdl:part name="Result" type="s:decimal"/>
   </wsdl:message>

在这种情况下,我的开发人员已向AddNumbers和SubtractNumbers提供服务。

我要构建一个页面,其中包含以下区域:“ AddNumberRequest” 它需要两个输入:“ Value1”和“ Value2”

和一个区域:“ SubtractNumbersRequest” 它需要两个输入:“ Value1”和“ Text1”

您可以想象这里的开发人员在执行“ SubtractNumbers”时,要求用户输入“ Text1”而不是“ Value2”,从而犯了一个错误。如果开发人员更改了此代码,则Web服务将自动更改,因此,我的Apps应该向用户询问更改的类型。

“实例”是由我的应用自动生成的,因此,我不会将其显示给用户。

其他: 以下是我可以为其创建输入的所有类型,我的开发人员可以在其中进行选择:

   <wsdl:message name="InputAllTypesRequest">
       <wsdl:part name="Instance" type="s:string"/>
       <wsdl:part name="Value" type="s:decimal"/>
       <wsdl:part name="Flag" type="s:boolean"/>
       <wsdl:part name="Date" type="s:date"/>
       <wsdl:part name="DateTime" type="s:dateTime"/>
       <wsdl:part name="Text" type="s:string"/>
       <wsdl:part name="Password" type="s:string"/>
       <wsdl:part name="Time" type="s:time"/>
       <wsdl:part name="TimeSpan" type="s:duration"/>
       <wsdl:part name="Binary" type="s:base64Binary"/>
   </wsdl:message>
   <wsdl:message name="InputAllTypesResponse">
       <wsdl:part name="Result" type="s:decimal"/>
   </wsdl:message>

任何人都可以帮助我寻求指导或代码示例。我是Xamarin的新手,但以上问题,我无法通过搜索网络来破解。

1 个答案:

答案 0 :(得分:0)

您将无法在XAML中动态构建UI,但是使用代码相当简单。从概念上讲,您只需要遍历控件列表,动态创建每个控件,然后将其添加到布局中即可。

StackLayout stack = new StackLayout();

// controls is an array or list that defines your control data
foreach (var c in controls) 
{
  switch (c.Type) 
  {
    case "Text":
      var control = new Entry();
      stack.Add(control);
      break;
    case // other control types
  }
}