Xamarin Android 和 iOS 中的 Visual Basic
该示例应用程序演示了编译到 .NET Standard 库中的 Visual Basic 代码如何与 Xamarin 结合使用。 下面是 iOS 和 Android 上运行的生成应用的一些屏幕截图:
示例中的 Android 和 iOS 项目都采用 C# 编写。 每个应用程序的用户界面都是使用本机技术生成的,而 TodoItem
管理由使用 XML 文件的 Visual Basic .NET Standard 库提供(供演示,非完整数据库)。
示例演练
本指南讨论如何在适用于 iOS 和 Android 的 TaskyVB Xamarin 示例中实现 Visual Basic。
注意
在继续阅读本指南之前,请查看有关 Visual Basic 和 .NET Standard 的说明。
请参阅使用 Visual Basic 的 Xamarin.Forms 说明,了解如何使用共享用户界面 Visual Basic 代码生成应用。
VisualBasicNetStandard
Visual Basic .NET Standard 库只能在 Windows 上的 Visual Studio 中创建。 示例库包含以下 Visual Basic 文件中应用程序的基础知识:
- TodoItem.vb
- TodoItemManager.vb
- TodoItemRepositoryXML.vb
- XmlStorage.vb
TodoItem.vb
此类包含要在整个应用程序中使用的业务对象。 它将在 Visual Basic 中定义,并与采用 C# 编写的 Android 和 iOS 项目共享。
类定义如下所示:
Public Class TodoItem
Property ID() As Integer
Property Name() As String
Property Notes() As String
Property Done() As Boolean
End Class
此示例使用 XML 序列化和反序列化来加载和保存 TodoItem 对象。
TodoItemManager.vb
Manager 类为可移植代码提供“API”。 它为 TodoItem
类提供基本的 CRUD 操作,但不会实现这些操作。
Public Class TodoItemManager
Private _repository As TodoItemRepositoryXML
Public Sub New(filename As String)
_repository = New TodoItemRepositoryXML(filename, storage)
End Sub
Public Function GetTask(id As Integer) As TodoItem
Return _repository.GetTask(id)
End Function
Public Function GetTasks() As List(Of TodoItem)
Return New List(Of TodoItem)(_repository.GetTasks())
End Function
Public Function SaveTask(item As TodoItem) As Integer
Return _repository.SaveTask(item)
End Function
Public Function DeleteTask(item As TodoItem) As Integer
Return _repository.DeleteTask(item.ID)
End Function
End Class
构造函数采用 IXmlStorage 实例作为参数。 这允许每个平台提供自己的工作实现,同时仍允许可移植代码描述可共享的其他功能。
TodoItemRepository.vb
存储库类包含用于管理 TodoItem 对象列表的逻辑。 完整的代码如下所示 - 逻辑主要用于在 TodoItems 中管理唯一 ID 值,因为它们是从集合中添加和删除的。
Public Class TodoItemRepositoryXML
Private _filename As String
Private _storage As IXmlStorage
Private _tasks As List(Of TodoItem)
''' <summary>Constructor</summary>
Public Sub New(filename As String)
_filename = filename
_storage = New XmlStorage
_tasks = _storage.ReadXml(filename)
End Sub
''' <summary>Inefficient search for a Task by ID</summary>
Public Function GetTask(id As Integer) As TodoItem
For t As Integer = 0 To _tasks.Count - 1
If _tasks(t).ID = id Then
Return _tasks(t)
End If
Next
Return New TodoItem() With {.ID = id}
End Function
''' <summary>List all the Tasks</summary>
Public Function GetTasks() As IEnumerable(Of TodoItem)
Return _tasks
End Function
''' <summary>Save a Task to the Xml file
''' Calculates the ID as the max of existing IDs</summary>
Public Function SaveTask(item As TodoItem) As Integer
Dim max As Integer = 0
If _tasks.Count > 0 Then
max = _tasks.Max(Function(t As TodoItem) t.ID)
End If
If item.ID = 0 Then
item.ID = ++max
_tasks.Add(item)
Else
Dim j = _tasks.Where(Function(t) t.ID = item.ID).First()
j = item
End If
_storage.WriteXml(_tasks, _filename)
Return max
End Function
''' <summary>Removes the task from the XMl file</summary>
Public Function DeleteTask(id As Integer) As Integer
For t As Integer = 0 To _tasks.Count - 1
If _tasks(t).ID = id Then
_tasks.RemoveAt(t)
_storage.WriteXml(_tasks, _filename)
Return 1
End If
Next
Return -1
End Function
End Class
注意
此代码是一个非常基础的数据存储机制的示例。 它用于演示 .NET Standard 库如何针对接口编写代码,以访问平台特定功能(在本例中为加载和保存 XML 文件)。 它不是生产质量的数据库替代。
Android 和 iOS 应用程序项目
iOS
在 iOS 应用程序中,TodoItemManager
和 XmlStorageImplementation
在 AppDelegate.cs 文件中创建,如此代码片段所示。 前四行只是生成要存储数据的文件的路径;最后两行显示正在实例化的两个类。
var xmlFilename = "TodoList.xml";
string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); // Documents folder
string libraryPath = Path.Combine(documentsPath, "..", "Library"); // Library folder
var path = Path.Combine(libraryPath, xmlFilename);
TaskMgr = new TodoItemManager(path);
Android
在 Android 应用程序中,TodoItemManager
和 XmlStorageImplementation
在 Application.cs 文件中创建,如此代码片段所示。 前三行只是生成要存储数据的文件的路径;最后两行显示正在实例化的两个类。
var xmlFilename = "TodoList.xml";
string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
var path = Path.Combine(libraryPath, xmlFilename);
TaskMgr = new TodoItemManager(path);
应用程序代码的其余部分主要涉及用户界面以及使用 TaskMgr
类加载和保存 TodoItem
类。
Visual Studio 2019 for Mac
警告
Visual Studio for Mac 不支持编辑 Visual Basic 语言 - 没有用于创建 Visual Basic 项目或文件的菜单项。 如果打开 .vb,则没有语言语法突出显示、自动完成或 IntelliSense。
Visual Studio 2019 for Mac 可以编译在 Windows 上创建的 Visual Studio .NET Standard 项目,因此 iOS 应用可以引用这些项目。
Visual Studio 2017 根本无法生成 Visual Basic 项目。
总结
本文演示了如何使用 Visual Studio 和 .NET Standard 库在 Xamarin 应用程序中使用 Visual Basic 代码。 尽管 Xamarin 不直接支持 Visual Basic,但将 Visual Basic 编译到 .NET Standard 库中即可允许在 iOS 和 Android 应用中包含使用 Visual Basic 编写的代码。