Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
80 changes: 80 additions & 0 deletions docs/content/samples/todoapp/avalonia.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
+++
title = "Avalonia"
+++

## Run the application first

The Avalonia sample uses an in-memory Sqlite store for storing its data. The sample can run on Desktop, Mobile and Browser. To run the application locally:

* [Configure Visual Studio for Avalonia development](https://docs.avaloniaui.net/docs/welcome).
* Open `samples/todoapp/Samples.TodoApp.sln` in Visual Studio.
* In the Solution Explorer, expand the folder `TodoApp.Avalonia` and right-click the `TodoApp.Avalonia.Desktop` project, then select **Set as Startup Project**.
* Select a target (in the top bar), then press F5 to run the application.

> [!TIP]
> We suggest to start testing and debugging using the Desktop App first. Once you feel confident, you can also try out Mobile or Browser version.

> [!NOTE]
> If you bump into issues at this point, please visit [Avalonia.Docs](https://docs.avaloniaui.net) and [Avalonia.Samples](https://github.com/AvaloniaUI/Avalonia.Samples) for some basic getting-started tutorials.

This is how the sample will look like:
![Avalonia sample on Desktop](assets/TodoApp.Avalonia.Desktop.png)


## Deploy a datasync server to Azure

Before you begin adjusting the application for offline usage, you must [deploy a datasync service](../server.md). Make a note of the URI of the service before continuing.

## Update the application for datasync operations

All the changes are isolated to the `Database/AppDbContext.cs` file.

1. Change the definition of the class so that it inherits from `OfflineDbContext`:

```csharp
public class AppDbContext(DbContextOptions<AppDbContext> options) : OfflineDbContext(options)
{
// Rest of the class
}
```

2. Add the `OnDatasyncInitialization()` method:

```csharp
protected override void OnDatasyncInitialization(DatasyncOfflineOptionsBuilder optionsBuilder)
{
HttpClientOptions clientOptions = new()
{
Endpoint = new Uri("https://YOURSITEHERE.azurewebsites.net/"),
HttpPipeline = [new LoggingHandler()]
};
_ = optionsBuilder.UseHttpClientOptions(clientOptions);
}
```

Replace the Endpoint with the URI of your datasync service.

3. Update the `SynchronizeAsync()` method.

The `SynchronizeAsync()` method is used by the application to synchronize data to and from the datasync service. It is called primarily from the `MainViewModel` which drives the UI interactions for the main list.

```csharp
public async Task SynchronizeAsync(CancellationToken cancellationToken = default)
{
PushResult pushResult = await this.PushAsync(cancellationToken);
if (!pushResult.IsSuccessful)
{
throw new ApplicationException($"Push failed: {pushResult.FailedRequests.FirstOrDefault().Value.ReasonPhrase}");
}

PullResult pullResult = await this.PullAsync(cancellationToken);
if (!pullResult.IsSuccessful)
{
throw new ApplicationException($"Pull failed: {pullResult.FailedRequests.FirstOrDefault().Value.ReasonPhrase}");
}
}
```

You can now re-run your application. Watch the console logs to show the interactions with the datasync service. Press the refresh button to synchronize data with the cloud. When you restart the application, your changes will automatically populate the database again.

Obviously, you will want to do much more in a "real world" application, including proper error handling, authentication, and using a Sqlite file instead of an in-memory database. This example shows off the minimum required to add datasync services to an application.
97 changes: 97 additions & 0 deletions samples/todoapp/Samples.TodoApp.sln
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,18 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TodoApp.MAUI", "TodoApp.MAU
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TodoApp.WPF", "TodoApp.WPF\TodoApp.WPF.csproj", "{A0996FB8-890D-4E90-A881-01F9EF709711}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TodoApp.Avalonia", "TodoApp.Avalonia", "{9A8B7D7F-1AF1-4C1C-A74A-E422BB680C6E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TodoApp.Avalonia", "TodoApp.Avalonia\TodoApp.Avalonia\TodoApp.Avalonia.csproj", "{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TodoApp.Avalonia.Android", "TodoApp.Avalonia\TodoApp.Avalonia.Android\TodoApp.Avalonia.Android.csproj", "{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TodoApp.Avalonia.Desktop", "TodoApp.Avalonia\TodoApp.Avalonia.Desktop\TodoApp.Avalonia.Desktop.csproj", "{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TodoApp.Avalonia.iOS", "TodoApp.Avalonia\TodoApp.Avalonia.iOS\TodoApp.Avalonia.iOS.csproj", "{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TodoApp.Avalonia.Browser", "TodoApp.Avalonia\TodoApp.Avalonia.Browser\TodoApp.Avalonia.Browser.csproj", "{E8BB1310-477D-44B0-B13E-77F09433D0A3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -123,12 +135,97 @@ Global
{A0996FB8-890D-4E90-A881-01F9EF709711}.Release|x64.Build.0 = Release|Any CPU
{A0996FB8-890D-4E90-A881-01F9EF709711}.Release|x86.ActiveCfg = Release|Any CPU
{A0996FB8-890D-4E90-A881-01F9EF709711}.Release|x86.Build.0 = Release|Any CPU
{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A}.Debug|ARM64.Build.0 = Debug|Any CPU
{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A}.Debug|x64.ActiveCfg = Debug|Any CPU
{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A}.Debug|x64.Build.0 = Debug|Any CPU
{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A}.Debug|x86.ActiveCfg = Debug|Any CPU
{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A}.Debug|x86.Build.0 = Debug|Any CPU
{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A}.Release|Any CPU.Build.0 = Release|Any CPU
{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A}.Release|ARM64.ActiveCfg = Release|Any CPU
{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A}.Release|ARM64.Build.0 = Release|Any CPU
{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A}.Release|x64.ActiveCfg = Release|Any CPU
{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A}.Release|x64.Build.0 = Release|Any CPU
{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A}.Release|x86.ActiveCfg = Release|Any CPU
{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A}.Release|x86.Build.0 = Release|Any CPU
{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4}.Debug|ARM64.Build.0 = Debug|Any CPU
{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4}.Debug|x64.ActiveCfg = Debug|Any CPU
{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4}.Debug|x64.Build.0 = Debug|Any CPU
{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4}.Debug|x86.ActiveCfg = Debug|Any CPU
{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4}.Debug|x86.Build.0 = Debug|Any CPU
{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4}.Release|Any CPU.Build.0 = Release|Any CPU
{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4}.Release|ARM64.ActiveCfg = Release|Any CPU
{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4}.Release|ARM64.Build.0 = Release|Any CPU
{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4}.Release|x64.ActiveCfg = Release|Any CPU
{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4}.Release|x64.Build.0 = Release|Any CPU
{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4}.Release|x86.ActiveCfg = Release|Any CPU
{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4}.Release|x86.Build.0 = Release|Any CPU
{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7}.Debug|ARM64.Build.0 = Debug|Any CPU
{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7}.Debug|x64.ActiveCfg = Debug|Any CPU
{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7}.Debug|x64.Build.0 = Debug|Any CPU
{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7}.Debug|x86.ActiveCfg = Debug|Any CPU
{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7}.Debug|x86.Build.0 = Debug|Any CPU
{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7}.Release|Any CPU.Build.0 = Release|Any CPU
{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7}.Release|ARM64.ActiveCfg = Release|Any CPU
{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7}.Release|ARM64.Build.0 = Release|Any CPU
{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7}.Release|x64.ActiveCfg = Release|Any CPU
{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7}.Release|x64.Build.0 = Release|Any CPU
{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7}.Release|x86.ActiveCfg = Release|Any CPU
{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7}.Release|x86.Build.0 = Release|Any CPU
{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1}.Debug|ARM64.Build.0 = Debug|Any CPU
{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1}.Debug|x64.ActiveCfg = Debug|Any CPU
{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1}.Debug|x64.Build.0 = Debug|Any CPU
{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1}.Debug|x86.ActiveCfg = Debug|Any CPU
{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1}.Debug|x86.Build.0 = Debug|Any CPU
{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1}.Release|Any CPU.Build.0 = Release|Any CPU
{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1}.Release|ARM64.ActiveCfg = Release|Any CPU
{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1}.Release|ARM64.Build.0 = Release|Any CPU
{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1}.Release|x64.ActiveCfg = Release|Any CPU
{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1}.Release|x64.Build.0 = Release|Any CPU
{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1}.Release|x86.ActiveCfg = Release|Any CPU
{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1}.Release|x86.Build.0 = Release|Any CPU
{E8BB1310-477D-44B0-B13E-77F09433D0A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E8BB1310-477D-44B0-B13E-77F09433D0A3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E8BB1310-477D-44B0-B13E-77F09433D0A3}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{E8BB1310-477D-44B0-B13E-77F09433D0A3}.Debug|ARM64.Build.0 = Debug|Any CPU
{E8BB1310-477D-44B0-B13E-77F09433D0A3}.Debug|x64.ActiveCfg = Debug|Any CPU
{E8BB1310-477D-44B0-B13E-77F09433D0A3}.Debug|x64.Build.0 = Debug|Any CPU
{E8BB1310-477D-44B0-B13E-77F09433D0A3}.Debug|x86.ActiveCfg = Debug|Any CPU
{E8BB1310-477D-44B0-B13E-77F09433D0A3}.Debug|x86.Build.0 = Debug|Any CPU
{E8BB1310-477D-44B0-B13E-77F09433D0A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E8BB1310-477D-44B0-B13E-77F09433D0A3}.Release|Any CPU.Build.0 = Release|Any CPU
{E8BB1310-477D-44B0-B13E-77F09433D0A3}.Release|ARM64.ActiveCfg = Release|Any CPU
{E8BB1310-477D-44B0-B13E-77F09433D0A3}.Release|ARM64.Build.0 = Release|Any CPU
{E8BB1310-477D-44B0-B13E-77F09433D0A3}.Release|x64.ActiveCfg = Release|Any CPU
{E8BB1310-477D-44B0-B13E-77F09433D0A3}.Release|x64.Build.0 = Release|Any CPU
{E8BB1310-477D-44B0-B13E-77F09433D0A3}.Release|x86.ActiveCfg = Release|Any CPU
{E8BB1310-477D-44B0-B13E-77F09433D0A3}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{2AC73FBE-9E76-4702-B551-B5884383CC68} = {7183ECEC-9F44-48CE-BB97-AA2445170D5E}
{539C6E0F-8F23-4AE0-B8E6-7E72C53B890A} = {9A8B7D7F-1AF1-4C1C-A74A-E422BB680C6E}
{9C2BA2A4-4AD6-4B67-BB6B-29A9024C33C4} = {9A8B7D7F-1AF1-4C1C-A74A-E422BB680C6E}
{3D741850-6FAA-4F36-BD58-F6ECE0CE55D7} = {9A8B7D7F-1AF1-4C1C-A74A-E422BB680C6E}
{DFCE2057-9F7B-4E1A-9C83-B524D9A82FF1} = {9A8B7D7F-1AF1-4C1C-A74A-E422BB680C6E}
{E8BB1310-477D-44B0-B13E-77F09433D0A3} = {9A8B7D7F-1AF1-4C1C-A74A-E422BB680C6E}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {91B9DE2A-8B79-4DC4-8235-216CD07F1CB2}
Expand Down
Loading