我正在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的新手,但以上问题,我无法通过搜索网络来破解。
答案 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
}
}