diff --git a/MapControlExtended.sln b/MapControlExtended.sln
index 5f48a774..84779ac6 100644
--- a/MapControlExtended.sln
+++ b/MapControlExtended.sln
@@ -47,9 +47,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MapUiTools.WPF", "MapUiTool
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Caches", "Caches", "{69E6CD1A-5619-4549-95FF-2FD126F1A5D2}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileDbCache", "Caches\FileDbCache\FileDbCache.csproj", "{E5A7A66A-36EC-4775-850A-A64253DF0383}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FileDbCache", "Caches\FileDbCache\FileDbCache.csproj", "{E5A7A66A-36EC-4775-850A-A64253DF0383}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SQLiteCache", "Caches\SQLiteCache\SQLiteCache.csproj", "{FDD70FB5-3B6D-43DF-8C2E-04100315C8BC}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SQLiteCache", "Caches\SQLiteCache\SQLiteCache.csproj", "{FDD70FB5-3B6D-43DF-8C2E-04100315C8BC}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MapControl.Avalonia", "MapControl\Avalonia\MapControl.Avalonia.csproj", "{0D621538-3DAD-4D3A-BB2C-220B6C580E51}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AvaloniaApp", "SampleApps\AvaloniaApp\AvaloniaApp.csproj", "{68629CA3-4599-4737-B44C-40B513DD1385}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MapUiTools.Avalonia", "MapUiTools\Avalonia\MapUiTools.Avalonia.csproj", "{3D61474F-2F72-47E2-87AA-2881AB552D1A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -367,6 +373,54 @@ Global
{FDD70FB5-3B6D-43DF-8C2E-04100315C8BC}.Release|x64.Build.0 = Release|Any CPU
{FDD70FB5-3B6D-43DF-8C2E-04100315C8BC}.Release|x86.ActiveCfg = Release|Any CPU
{FDD70FB5-3B6D-43DF-8C2E-04100315C8BC}.Release|x86.Build.0 = Release|Any CPU
+ {0D621538-3DAD-4D3A-BB2C-220B6C580E51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0D621538-3DAD-4D3A-BB2C-220B6C580E51}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0D621538-3DAD-4D3A-BB2C-220B6C580E51}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {0D621538-3DAD-4D3A-BB2C-220B6C580E51}.Debug|arm64.Build.0 = Debug|Any CPU
+ {0D621538-3DAD-4D3A-BB2C-220B6C580E51}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {0D621538-3DAD-4D3A-BB2C-220B6C580E51}.Debug|x64.Build.0 = Debug|Any CPU
+ {0D621538-3DAD-4D3A-BB2C-220B6C580E51}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0D621538-3DAD-4D3A-BB2C-220B6C580E51}.Debug|x86.Build.0 = Debug|Any CPU
+ {0D621538-3DAD-4D3A-BB2C-220B6C580E51}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0D621538-3DAD-4D3A-BB2C-220B6C580E51}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0D621538-3DAD-4D3A-BB2C-220B6C580E51}.Release|arm64.ActiveCfg = Release|Any CPU
+ {0D621538-3DAD-4D3A-BB2C-220B6C580E51}.Release|arm64.Build.0 = Release|Any CPU
+ {0D621538-3DAD-4D3A-BB2C-220B6C580E51}.Release|x64.ActiveCfg = Release|Any CPU
+ {0D621538-3DAD-4D3A-BB2C-220B6C580E51}.Release|x64.Build.0 = Release|Any CPU
+ {0D621538-3DAD-4D3A-BB2C-220B6C580E51}.Release|x86.ActiveCfg = Release|Any CPU
+ {0D621538-3DAD-4D3A-BB2C-220B6C580E51}.Release|x86.Build.0 = Release|Any CPU
+ {68629CA3-4599-4737-B44C-40B513DD1385}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {68629CA3-4599-4737-B44C-40B513DD1385}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {68629CA3-4599-4737-B44C-40B513DD1385}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {68629CA3-4599-4737-B44C-40B513DD1385}.Debug|arm64.Build.0 = Debug|Any CPU
+ {68629CA3-4599-4737-B44C-40B513DD1385}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {68629CA3-4599-4737-B44C-40B513DD1385}.Debug|x64.Build.0 = Debug|Any CPU
+ {68629CA3-4599-4737-B44C-40B513DD1385}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {68629CA3-4599-4737-B44C-40B513DD1385}.Debug|x86.Build.0 = Debug|Any CPU
+ {68629CA3-4599-4737-B44C-40B513DD1385}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {68629CA3-4599-4737-B44C-40B513DD1385}.Release|Any CPU.Build.0 = Release|Any CPU
+ {68629CA3-4599-4737-B44C-40B513DD1385}.Release|arm64.ActiveCfg = Release|Any CPU
+ {68629CA3-4599-4737-B44C-40B513DD1385}.Release|arm64.Build.0 = Release|Any CPU
+ {68629CA3-4599-4737-B44C-40B513DD1385}.Release|x64.ActiveCfg = Release|Any CPU
+ {68629CA3-4599-4737-B44C-40B513DD1385}.Release|x64.Build.0 = Release|Any CPU
+ {68629CA3-4599-4737-B44C-40B513DD1385}.Release|x86.ActiveCfg = Release|Any CPU
+ {68629CA3-4599-4737-B44C-40B513DD1385}.Release|x86.Build.0 = Release|Any CPU
+ {3D61474F-2F72-47E2-87AA-2881AB552D1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3D61474F-2F72-47E2-87AA-2881AB552D1A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3D61474F-2F72-47E2-87AA-2881AB552D1A}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {3D61474F-2F72-47E2-87AA-2881AB552D1A}.Debug|arm64.Build.0 = Debug|Any CPU
+ {3D61474F-2F72-47E2-87AA-2881AB552D1A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3D61474F-2F72-47E2-87AA-2881AB552D1A}.Debug|x64.Build.0 = Debug|Any CPU
+ {3D61474F-2F72-47E2-87AA-2881AB552D1A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3D61474F-2F72-47E2-87AA-2881AB552D1A}.Debug|x86.Build.0 = Debug|Any CPU
+ {3D61474F-2F72-47E2-87AA-2881AB552D1A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3D61474F-2F72-47E2-87AA-2881AB552D1A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3D61474F-2F72-47E2-87AA-2881AB552D1A}.Release|arm64.ActiveCfg = Release|Any CPU
+ {3D61474F-2F72-47E2-87AA-2881AB552D1A}.Release|arm64.Build.0 = Release|Any CPU
+ {3D61474F-2F72-47E2-87AA-2881AB552D1A}.Release|x64.ActiveCfg = Release|Any CPU
+ {3D61474F-2F72-47E2-87AA-2881AB552D1A}.Release|x64.Build.0 = Release|Any CPU
+ {3D61474F-2F72-47E2-87AA-2881AB552D1A}.Release|x86.ActiveCfg = Release|Any CPU
+ {3D61474F-2F72-47E2-87AA-2881AB552D1A}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -390,6 +444,9 @@ Global
{12430DAE-DC53-4C37-95D5-B8923B5FD3D7} = {90C681E9-12AE-4B5F-932D-7EF5D35D8436}
{E5A7A66A-36EC-4775-850A-A64253DF0383} = {69E6CD1A-5619-4549-95FF-2FD126F1A5D2}
{FDD70FB5-3B6D-43DF-8C2E-04100315C8BC} = {69E6CD1A-5619-4549-95FF-2FD126F1A5D2}
+ {0D621538-3DAD-4D3A-BB2C-220B6C580E51} = {52AECE49-F314-4F76-98F2-FA800F07824B}
+ {68629CA3-4599-4737-B44C-40B513DD1385} = {8F2103C2-78AF-4810-8FB9-67572F50C8FC}
+ {3D61474F-2F72-47E2-87AA-2881AB552D1A} = {90C681E9-12AE-4B5F-932D-7EF5D35D8436}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {458346DD-B23F-4FDC-8F9D-A10F1882A4DB}
diff --git a/SampleApps/AvaloniaApp/App.axaml b/SampleApps/AvaloniaApp/App.axaml
new file mode 100644
index 00000000..1a489672
--- /dev/null
+++ b/SampleApps/AvaloniaApp/App.axaml
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/SampleApps/AvaloniaApp/App.axaml.cs b/SampleApps/AvaloniaApp/App.axaml.cs
new file mode 100644
index 00000000..ed180dba
--- /dev/null
+++ b/SampleApps/AvaloniaApp/App.axaml.cs
@@ -0,0 +1,27 @@
+using Avalonia;
+using Avalonia.Controls.ApplicationLifetimes;
+using Avalonia.Markup.Xaml;
+
+namespace AvaloniaApp
+{
+ public partial class App : Application
+ {
+ public override void Initialize()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+
+ public override void OnFrameworkInitializationCompleted()
+ {
+ if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
+ {
+ desktop.MainWindow = new MainWindow
+ {
+ //DataContext = new MainViewModel()
+ };
+ }
+
+ base.OnFrameworkInitializationCompleted();
+ }
+ }
+}
\ No newline at end of file
diff --git a/SampleApps/AvaloniaApp/AvaloniaApp.csproj b/SampleApps/AvaloniaApp/AvaloniaApp.csproj
new file mode 100644
index 00000000..c2d0e41c
--- /dev/null
+++ b/SampleApps/AvaloniaApp/AvaloniaApp.csproj
@@ -0,0 +1,34 @@
+
+
+ WinExe
+ net8.0
+ true
+ AVALONIA
+
+
+
+
+ Never
+
+
+
+
+
+ Always
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SampleApps/AvaloniaApp/MainWindow.axaml b/SampleApps/AvaloniaApp/MainWindow.axaml
new file mode 100644
index 00000000..da4c42e3
--- /dev/null
+++ b/SampleApps/AvaloniaApp/MainWindow.axaml
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SampleApps/AvaloniaApp/MainWindow.axaml.cs b/SampleApps/AvaloniaApp/MainWindow.axaml.cs
new file mode 100644
index 00000000..b31ea1a3
--- /dev/null
+++ b/SampleApps/AvaloniaApp/MainWindow.axaml.cs
@@ -0,0 +1,76 @@
+using Avalonia.Controls;
+using Avalonia.Input;
+using Avalonia.Media;
+using MapControl;
+using MapControl.UiTools;
+using System;
+using System.IO;
+
+namespace AvaloniaApp
+{
+ public partial class MainWindow : Window
+ {
+ static MainWindow()
+ {
+ //TileImageLoader.Cache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder);
+
+ var bingMapsApiKeyPath = Path.Combine(
+ Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MapControl", "BingMapsApiKey.txt");
+
+ if (File.Exists(bingMapsApiKeyPath))
+ {
+ BingMapsTileLayer.ApiKey = File.ReadAllText(bingMapsApiKeyPath)?.Trim();
+ }
+ }
+
+ public MainWindow()
+ {
+ InitializeComponent();
+
+ if (!string.IsNullOrEmpty(BingMapsTileLayer.ApiKey))
+ {
+ mapLayersMenuButton.MapLayers.Add(new MapLayerItem
+ {
+ Text = "Bing Maps Road",
+ Layer = new BingMapsTileLayer
+ {
+ Mode = BingMapsTileLayer.MapMode.Road,
+ SourceName = "Bing Maps Road",
+ Description = "© [Microsoft](http://www.bing.com/maps/)"
+ }
+ });
+
+ mapLayersMenuButton.MapLayers.Add(new MapLayerItem
+ {
+ Text = "Bing Maps Aerial",
+ Layer = new BingMapsTileLayer
+ {
+ Mode = BingMapsTileLayer.MapMode.Aerial,
+ SourceName = "Bing Maps Aerial",
+ Description = "© [Microsoft](http://www.bing.com/maps/)",
+ MapForeground = Brushes.White,
+ MapBackground = Brushes.Black
+ }
+ });
+
+ mapLayersMenuButton.MapLayers.Add(new MapLayerItem
+ {
+ Text = "Bing Maps Aerial with Labels",
+ Layer = new BingMapsTileLayer
+ {
+ Mode = BingMapsTileLayer.MapMode.AerialWithLabels,
+ SourceName = "Bing Maps Hybrid",
+ Description = "© [Microsoft](http://www.bing.com/maps/)",
+ MapForeground = Brushes.White,
+ MapBackground = Brushes.Black
+ }
+ });
+ }
+ }
+
+ private void OnMapDoubleTapped(object sender, TappedEventArgs e)
+ {
+ map.TargetCenter = map.ViewToLocation(e.GetPosition(map));
+ }
+ }
+}
diff --git a/SampleApps/AvaloniaApp/Program.cs b/SampleApps/AvaloniaApp/Program.cs
new file mode 100644
index 00000000..daecab48
--- /dev/null
+++ b/SampleApps/AvaloniaApp/Program.cs
@@ -0,0 +1,24 @@
+using Avalonia;
+using System;
+
+namespace AvaloniaApp
+{
+ class Program
+ {
+ [STAThread]
+ public static void Main(string[] args)
+ {
+ BuildAvaloniaApp()
+ .StartWithClassicDesktopLifetime(args);
+ }
+
+ public static AppBuilder BuildAvaloniaApp()
+ {
+ return AppBuilder
+ .Configure()
+ .UsePlatformDetect()
+ .WithInterFont()
+ .LogToTrace();
+ }
+ }
+}
diff --git a/SampleApps/WinUiApp/MainWindow.xaml b/SampleApps/WinUiApp/MainWindow.xaml
index 519c76cb..57e40a31 100644
--- a/SampleApps/WinUiApp/MainWindow.xaml
+++ b/SampleApps/WinUiApp/MainWindow.xaml
@@ -114,6 +114,7 @@
-
-
-
+
+
-
-
+
+
+