diff --git a/Directory.Build.props b/Directory.Build.props index 57f06a40f636..55f8a7d31e96 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -26,6 +26,7 @@ false false false + false @@ -256,6 +257,13 @@ $(MauiPreviousPlatforms) $(MauiGraphicsPreviousPlatforms);net$(_MauiPreviousDotNetVersion)-macos$(MacosPreviousTargetFrameworkVersion) + + + $(MauiPlatforms) + $(MauiEssentialsAIPlatforms);net$(_MauiDotNetVersion)-macos$(MacosTargetFrameworkVersion) + + $(MauiPreviousPlatforms) + $(MauiEssentialsAIPreviousPlatforms);net$(_MauiPreviousDotNetVersion)-macos$(MacosPreviousTargetFrameworkVersion) diff --git a/Microsoft.Maui-dev.sln b/Microsoft.Maui-dev.sln index 794ff6270d15..9af223fe1b84 100644 --- a/Microsoft.Maui-dev.sln +++ b/Microsoft.Maui-dev.sln @@ -246,6 +246,24 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Maui.Controls.Sample.Embedd EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Controls.ManualTests", "src\Controls\tests\ManualTests\Controls.ManualTests.csproj", "{E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AI", "AI", "{BA58FF10-E1F2-1F22-EED5-4647CFF8BF60}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{9B194A14-0963-842E-BCDD-4A2CBB559451}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{81F26DD8-70CC-7F24-050C-594BCCA2AEBB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{BE0B3DF2-F37C-449D-F624-39E4FE56170C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials.AI", "src\AI\src\Essentials.AI\Essentials.AI.csproj", "{376DAEDF-D41D-4AF4-9548-9DDC9538D533}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials.AI.Sample", "src\AI\samples\Essentials.AI.Sample\Essentials.AI.Sample.csproj", "{7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials.AI.Benchmarks", "src\AI\tests\Essentials.AI.Benchmarks\Essentials.AI.Benchmarks.csproj", "{B578E852-193C-4F37-ACB1-2B9B1B32F6B6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials.AI.DeviceTests", "src\AI\tests\Essentials.AI.DeviceTests\Essentials.AI.DeviceTests.csproj", "{90B0A751-82EA-4575-B22C-256EF3A4FEF1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials.AI.UnitTests", "src\AI\tests\Essentials.AI.UnitTests\Essentials.AI.UnitTests.csproj", "{BD5D52FA-CA8E-4236-979A-95B4CE4158D8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -635,6 +653,26 @@ Global {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}.Debug|Any CPU.Build.0 = Debug|Any CPU {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}.Release|Any CPU.ActiveCfg = Release|Any CPU {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}.Release|Any CPU.Build.0 = Release|Any CPU + {376DAEDF-D41D-4AF4-9548-9DDC9538D533}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {376DAEDF-D41D-4AF4-9548-9DDC9538D533}.Debug|Any CPU.Build.0 = Debug|Any CPU + {376DAEDF-D41D-4AF4-9548-9DDC9538D533}.Release|Any CPU.ActiveCfg = Release|Any CPU + {376DAEDF-D41D-4AF4-9548-9DDC9538D533}.Release|Any CPU.Build.0 = Release|Any CPU + {7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0}.Release|Any CPU.Build.0 = Release|Any CPU + {B578E852-193C-4F37-ACB1-2B9B1B32F6B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B578E852-193C-4F37-ACB1-2B9B1B32F6B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B578E852-193C-4F37-ACB1-2B9B1B32F6B6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B578E852-193C-4F37-ACB1-2B9B1B32F6B6}.Release|Any CPU.Build.0 = Release|Any CPU + {90B0A751-82EA-4575-B22C-256EF3A4FEF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90B0A751-82EA-4575-B22C-256EF3A4FEF1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90B0A751-82EA-4575-B22C-256EF3A4FEF1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90B0A751-82EA-4575-B22C-256EF3A4FEF1}.Release|Any CPU.Build.0 = Release|Any CPU + {BD5D52FA-CA8E-4236-979A-95B4CE4158D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD5D52FA-CA8E-4236-979A-95B4CE4158D8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD5D52FA-CA8E-4236-979A-95B4CE4158D8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD5D52FA-CA8E-4236-979A-95B4CE4158D8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -748,6 +786,14 @@ Global {55905937-1399-46DB-BA38-E426801CB759} = {7AC28763-9C68-4BF9-A1BA-25CBFFD2D15C} {4ADCBA87-30DB-44F5-85E9-94A4F4132FD9} = {E1082E26-D700-4127-9329-66D673FD2D55} {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C} = {25D0D27A-C5FE-443D-8B65-D6C987F4A80E} + {9B194A14-0963-842E-BCDD-4A2CBB559451} = {BA58FF10-E1F2-1F22-EED5-4647CFF8BF60} + {81F26DD8-70CC-7F24-050C-594BCCA2AEBB} = {BA58FF10-E1F2-1F22-EED5-4647CFF8BF60} + {BE0B3DF2-F37C-449D-F624-39E4FE56170C} = {BA58FF10-E1F2-1F22-EED5-4647CFF8BF60} + {376DAEDF-D41D-4AF4-9548-9DDC9538D533} = {9B194A14-0963-842E-BCDD-4A2CBB559451} + {7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0} = {81F26DD8-70CC-7F24-050C-594BCCA2AEBB} + {B578E852-193C-4F37-ACB1-2B9B1B32F6B6} = {BE0B3DF2-F37C-449D-F624-39E4FE56170C} + {90B0A751-82EA-4575-B22C-256EF3A4FEF1} = {BE0B3DF2-F37C-449D-F624-39E4FE56170C} + {BD5D52FA-CA8E-4236-979A-95B4CE4158D8} = {BE0B3DF2-F37C-449D-F624-39E4FE56170C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {0B8ABEAD-D2B5-4370-A187-62B5ABE4EE50} diff --git a/Microsoft.Maui-mac.slnf b/Microsoft.Maui-mac.slnf index d459143e2a5a..623e1571661a 100644 --- a/Microsoft.Maui-mac.slnf +++ b/Microsoft.Maui-mac.slnf @@ -2,6 +2,11 @@ "solution": { "path": "Microsoft.Maui-dev.sln", "projects": [ + "src\\AI\\samples\\Essentials.AI.Sample\\Essentials.AI.Sample.csproj", + "src\\AI\\src\\Essentials.AI\\Essentials.AI.csproj", + "src\\AI\\tests\\Essentials.AI.Benchmarks\\Essentials.AI.Benchmarks.csproj", + "src\\AI\\tests\\Essentials.AI.DeviceTests\\Essentials.AI.DeviceTests.csproj", + "src\\AI\\tests\\Essentials.AI.UnitTests\\Essentials.AI.UnitTests.csproj", "src\\BlazorWebView\\samples\\MauiRazorClassLibrarySample\\MauiRazorClassLibrarySample.csproj", "src\\BlazorWebView\\samples\\WebViewAppShared\\WebViewAppShared.csproj", "src\\BlazorWebView\\src\\Maui\\Microsoft.AspNetCore.Components.WebView.Maui.csproj", diff --git a/Microsoft.Maui-vscode.sln b/Microsoft.Maui-vscode.sln index 7217d8c92cfd..3e88b3db593e 100644 --- a/Microsoft.Maui-vscode.sln +++ b/Microsoft.Maui-vscode.sln @@ -220,6 +220,24 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SourceGen.UnitTests", "src\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Maui.Controls.Xaml.Benchmarks", "src\Controls\tests\Xaml.Benchmarks\Microsoft.Maui.Controls.Xaml.Benchmarks.csproj", "{9A0A5037-DB03-4C80-876C-61FCDAE4CCAD}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AI", "AI", "{BA58FF10-E1F2-1F22-EED5-4647CFF8BF60}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{9B194A14-0963-842E-BCDD-4A2CBB559451}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{81F26DD8-70CC-7F24-050C-594BCCA2AEBB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{BE0B3DF2-F37C-449D-F624-39E4FE56170C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials.AI", "src\AI\src\Essentials.AI\Essentials.AI.csproj", "{376DAEDF-D41D-4AF4-9548-9DDC9538D533}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials.AI.Sample", "src\AI\samples\Essentials.AI.Sample\Essentials.AI.Sample.csproj", "{7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials.AI.Benchmarks", "src\AI\tests\Essentials.AI.Benchmarks\Essentials.AI.Benchmarks.csproj", "{B578E852-193C-4F37-ACB1-2B9B1B32F6B6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials.AI.DeviceTests", "src\AI\tests\Essentials.AI.DeviceTests\Essentials.AI.DeviceTests.csproj", "{90B0A751-82EA-4575-B22C-256EF3A4FEF1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials.AI.UnitTests", "src\AI\tests\Essentials.AI.UnitTests\Essentials.AI.UnitTests.csproj", "{BD5D52FA-CA8E-4236-979A-95B4CE4158D8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -563,6 +581,26 @@ Global {9A0A5037-DB03-4C80-876C-61FCDAE4CCAD}.Debug|Any CPU.Build.0 = Debug|Any CPU {9A0A5037-DB03-4C80-876C-61FCDAE4CCAD}.Release|Any CPU.ActiveCfg = Release|Any CPU {9A0A5037-DB03-4C80-876C-61FCDAE4CCAD}.Release|Any CPU.Build.0 = Release|Any CPU + {376DAEDF-D41D-4AF4-9548-9DDC9538D533}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {376DAEDF-D41D-4AF4-9548-9DDC9538D533}.Debug|Any CPU.Build.0 = Debug|Any CPU + {376DAEDF-D41D-4AF4-9548-9DDC9538D533}.Release|Any CPU.ActiveCfg = Release|Any CPU + {376DAEDF-D41D-4AF4-9548-9DDC9538D533}.Release|Any CPU.Build.0 = Release|Any CPU + {7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0}.Release|Any CPU.Build.0 = Release|Any CPU + {B578E852-193C-4F37-ACB1-2B9B1B32F6B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B578E852-193C-4F37-ACB1-2B9B1B32F6B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B578E852-193C-4F37-ACB1-2B9B1B32F6B6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B578E852-193C-4F37-ACB1-2B9B1B32F6B6}.Release|Any CPU.Build.0 = Release|Any CPU + {90B0A751-82EA-4575-B22C-256EF3A4FEF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90B0A751-82EA-4575-B22C-256EF3A4FEF1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90B0A751-82EA-4575-B22C-256EF3A4FEF1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90B0A751-82EA-4575-B22C-256EF3A4FEF1}.Release|Any CPU.Build.0 = Release|Any CPU + {BD5D52FA-CA8E-4236-979A-95B4CE4158D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD5D52FA-CA8E-4236-979A-95B4CE4158D8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD5D52FA-CA8E-4236-979A-95B4CE4158D8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD5D52FA-CA8E-4236-979A-95B4CE4158D8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -664,6 +702,14 @@ Global {4ADCBA87-30DB-44F5-85E9-94A4F4132FD9} = {E1082E26-D700-4127-9329-66D673FD2D55} {A426B2FC-F012-436B-BDD9-BEC0025DB96B} = {25D0D27A-C5FE-443D-8B65-D6C987F4A80E} {9A0A5037-DB03-4C80-876C-61FCDAE4CCAD} = {25D0D27A-C5FE-443D-8B65-D6C987F4A80E} + {9B194A14-0963-842E-BCDD-4A2CBB559451} = {BA58FF10-E1F2-1F22-EED5-4647CFF8BF60} + {81F26DD8-70CC-7F24-050C-594BCCA2AEBB} = {BA58FF10-E1F2-1F22-EED5-4647CFF8BF60} + {BE0B3DF2-F37C-449D-F624-39E4FE56170C} = {BA58FF10-E1F2-1F22-EED5-4647CFF8BF60} + {376DAEDF-D41D-4AF4-9548-9DDC9538D533} = {9B194A14-0963-842E-BCDD-4A2CBB559451} + {7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0} = {81F26DD8-70CC-7F24-050C-594BCCA2AEBB} + {B578E852-193C-4F37-ACB1-2B9B1B32F6B6} = {BE0B3DF2-F37C-449D-F624-39E4FE56170C} + {90B0A751-82EA-4575-B22C-256EF3A4FEF1} = {BE0B3DF2-F37C-449D-F624-39E4FE56170C} + {BD5D52FA-CA8E-4236-979A-95B4CE4158D8} = {BE0B3DF2-F37C-449D-F624-39E4FE56170C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {0B8ABEAD-D2B5-4370-A187-62B5ABE4EE50} diff --git a/Microsoft.Maui-windows.slnf b/Microsoft.Maui-windows.slnf index 708d9629a8d9..4ed4c36e2225 100644 --- a/Microsoft.Maui-windows.slnf +++ b/Microsoft.Maui-windows.slnf @@ -2,6 +2,11 @@ "solution": { "path": "Microsoft.Maui-dev.sln", "projects": [ + "src\\AI\\samples\\Essentials.AI.Sample\\Essentials.AI.Sample.csproj", + "src\\AI\\src\\Essentials.AI\\Essentials.AI.csproj", + "src\\AI\\tests\\Essentials.AI.Benchmarks\\Essentials.AI.Benchmarks.csproj", + "src\\AI\\tests\\Essentials.AI.DeviceTests\\Essentials.AI.DeviceTests.csproj", + "src\\AI\\tests\\Essentials.AI.UnitTests\\Essentials.AI.UnitTests.csproj", "src\\BlazorWebView\\samples\\BlazorWinFormsApp\\BlazorWinFormsApp.csproj", "src\\BlazorWebView\\samples\\BlazorWpfApp\\BlazorWpfApp.csproj", "src\\BlazorWebView\\samples\\MauiRazorClassLibrarySample\\MauiRazorClassLibrarySample.csproj", diff --git a/Microsoft.Maui.sln b/Microsoft.Maui.sln index fbbeaadc0200..37c133515923 100644 --- a/Microsoft.Maui.sln +++ b/Microsoft.Maui.sln @@ -251,6 +251,24 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Maui.Controls.Sample.Embedd EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Controls.ManualTests", "src\Controls\tests\ManualTests\Controls.ManualTests.csproj", "{E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AI", "AI", "{BA58FF10-E1F2-1F22-EED5-4647CFF8BF60}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{9B194A14-0963-842E-BCDD-4A2CBB559451}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{81F26DD8-70CC-7F24-050C-594BCCA2AEBB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{BE0B3DF2-F37C-449D-F624-39E4FE56170C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials.AI", "src\AI\src\Essentials.AI\Essentials.AI.csproj", "{376DAEDF-D41D-4AF4-9548-9DDC9538D533}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials.AI.Sample", "src\AI\samples\Essentials.AI.Sample\Essentials.AI.Sample.csproj", "{7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials.AI.Benchmarks", "src\AI\tests\Essentials.AI.Benchmarks\Essentials.AI.Benchmarks.csproj", "{B578E852-193C-4F37-ACB1-2B9B1B32F6B6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials.AI.DeviceTests", "src\AI\tests\Essentials.AI.DeviceTests\Essentials.AI.DeviceTests.csproj", "{90B0A751-82EA-4575-B22C-256EF3A4FEF1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials.AI.UnitTests", "src\AI\tests\Essentials.AI.UnitTests\Essentials.AI.UnitTests.csproj", "{BD5D52FA-CA8E-4236-979A-95B4CE4158D8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -648,6 +666,26 @@ Global {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}.Debug|Any CPU.Build.0 = Debug|Any CPU {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}.Release|Any CPU.ActiveCfg = Release|Any CPU {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C}.Release|Any CPU.Build.0 = Release|Any CPU + {376DAEDF-D41D-4AF4-9548-9DDC9538D533}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {376DAEDF-D41D-4AF4-9548-9DDC9538D533}.Debug|Any CPU.Build.0 = Debug|Any CPU + {376DAEDF-D41D-4AF4-9548-9DDC9538D533}.Release|Any CPU.ActiveCfg = Release|Any CPU + {376DAEDF-D41D-4AF4-9548-9DDC9538D533}.Release|Any CPU.Build.0 = Release|Any CPU + {7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0}.Release|Any CPU.Build.0 = Release|Any CPU + {B578E852-193C-4F37-ACB1-2B9B1B32F6B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B578E852-193C-4F37-ACB1-2B9B1B32F6B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B578E852-193C-4F37-ACB1-2B9B1B32F6B6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B578E852-193C-4F37-ACB1-2B9B1B32F6B6}.Release|Any CPU.Build.0 = Release|Any CPU + {90B0A751-82EA-4575-B22C-256EF3A4FEF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90B0A751-82EA-4575-B22C-256EF3A4FEF1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90B0A751-82EA-4575-B22C-256EF3A4FEF1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90B0A751-82EA-4575-B22C-256EF3A4FEF1}.Release|Any CPU.Build.0 = Release|Any CPU + {BD5D52FA-CA8E-4236-979A-95B4CE4158D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD5D52FA-CA8E-4236-979A-95B4CE4158D8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD5D52FA-CA8E-4236-979A-95B4CE4158D8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD5D52FA-CA8E-4236-979A-95B4CE4158D8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -764,6 +802,14 @@ Global {F1BC506B-3A9E-4779-994E-339AFB21C9B9} = {7AC28763-9C68-4BF9-A1BA-25CBFFD2D15C} {4ADCBA87-30DB-44F5-85E9-94A4F4132FD9} = {E1082E26-D700-4127-9329-66D673FD2D55} {E2BFD1F1-07A8-8DBE-3661-894D0FE37D9C} = {25D0D27A-C5FE-443D-8B65-D6C987F4A80E} + {9B194A14-0963-842E-BCDD-4A2CBB559451} = {BA58FF10-E1F2-1F22-EED5-4647CFF8BF60} + {81F26DD8-70CC-7F24-050C-594BCCA2AEBB} = {BA58FF10-E1F2-1F22-EED5-4647CFF8BF60} + {BE0B3DF2-F37C-449D-F624-39E4FE56170C} = {BA58FF10-E1F2-1F22-EED5-4647CFF8BF60} + {376DAEDF-D41D-4AF4-9548-9DDC9538D533} = {9B194A14-0963-842E-BCDD-4A2CBB559451} + {7A6CB0C2-B5A9-44BA-B774-D1E1C1E371D0} = {81F26DD8-70CC-7F24-050C-594BCCA2AEBB} + {B578E852-193C-4F37-ACB1-2B9B1B32F6B6} = {BE0B3DF2-F37C-449D-F624-39E4FE56170C} + {90B0A751-82EA-4575-B22C-256EF3A4FEF1} = {BE0B3DF2-F37C-449D-F624-39E4FE56170C} + {BD5D52FA-CA8E-4236-979A-95B4CE4158D8} = {BE0B3DF2-F37C-449D-F624-39E4FE56170C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {0B8ABEAD-D2B5-4370-A187-62B5ABE4EE50} diff --git a/eng/Microsoft.Maui.Packages-mac.slnf b/eng/Microsoft.Maui.Packages-mac.slnf index 5034642aaa1c..5529edb22fdb 100644 --- a/eng/Microsoft.Maui.Packages-mac.slnf +++ b/eng/Microsoft.Maui.Packages-mac.slnf @@ -2,6 +2,7 @@ "solution": { "path": "..\\Microsoft.Maui.sln", "projects": [ + "src\\AI\\src\\Essentials.AI\\Essentials.AI.csproj", "src\\BlazorWebView\\src\\Maui\\Microsoft.AspNetCore.Components.WebView.Maui.csproj", "src\\Compatibility\\Core\\src\\Compatibility.csproj", "src\\Controls\\Foldable\\src\\Controls.Foldable.csproj", diff --git a/eng/Microsoft.Maui.Packages.slnf b/eng/Microsoft.Maui.Packages.slnf index 45bbff7c3a3a..7c21491d97e3 100644 --- a/eng/Microsoft.Maui.Packages.slnf +++ b/eng/Microsoft.Maui.Packages.slnf @@ -2,6 +2,7 @@ "solution": { "path": "..\\Microsoft.Maui.sln", "projects": [ + "src\\AI\\src\\Essentials.AI\\Essentials.AI.csproj", "src\\BlazorWebView\\src\\Maui\\Microsoft.AspNetCore.Components.WebView.Maui.csproj", "src\\BlazorWebView\\src\\WindowsForms\\Microsoft.AspNetCore.Components.WebView.WindowsForms.csproj", "src\\BlazorWebView\\src\\Wpf\\Microsoft.AspNetCore.Components.WebView.Wpf.csproj", diff --git a/eng/NuGetVersions.targets b/eng/NuGetVersions.targets index 123b99d6c4ff..6063ac89b505 100644 --- a/eng/NuGetVersions.targets +++ b/eng/NuGetVersions.targets @@ -84,6 +84,14 @@ Update="System.Runtime.CompilerServices.Unsafe" Version="$(SystemRuntimeCompilerServicesUnsafePackageVersion)" /> + + + https://github.com/dotnet/templating 3f4da9ced34942d83054e647f3b1d9d7dde281e8 + + https://github.com/dotnet/dotnet + 7b29526f2107416f68578bcb9deaca74fcfcf7f0 + + + https://github.com/dotnet/dotnet + 7b29526f2107416f68578bcb9deaca74fcfcf7f0 + https://github.com/dotnet/dotnet 7b29526f2107416f68578bcb9deaca74fcfcf7f0 diff --git a/eng/Versions.props b/eng/Versions.props index 5295426aefa5..a3c239e7d6b4 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -40,6 +40,8 @@ $(MicrosoftNETCoreAppRefPackageVersion) $(MicrosoftNETCoreAppRefPackageVersion) + 10.0.0 + 10.0.0 10.0.0 10.0.0 10.0.0 @@ -52,6 +54,7 @@ 10.0.0 10.0.0 10.0.0 + 10.0.0 36.1.2 35.0.105 diff --git a/src/AI/samples/Directory.Build.props b/src/AI/samples/Directory.Build.props new file mode 100644 index 000000000000..41af9256608e --- /dev/null +++ b/src/AI/samples/Directory.Build.props @@ -0,0 +1,10 @@ + + + true + true + Maui + $(WarningsNotAsErrors);XC0022;XC0023 + true + + + diff --git a/src/AI/samples/Directory.Build.targets b/src/AI/samples/Directory.Build.targets new file mode 100644 index 000000000000..68be46514e92 --- /dev/null +++ b/src/AI/samples/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/src/AI/samples/Essentials.AI.Sample/App.xaml b/src/AI/samples/Essentials.AI.Sample/App.xaml new file mode 100644 index 000000000000..bcb92097e3ff --- /dev/null +++ b/src/AI/samples/Essentials.AI.Sample/App.xaml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + diff --git a/src/AI/samples/Essentials.AI.Sample/App.xaml.cs b/src/AI/samples/Essentials.AI.Sample/App.xaml.cs new file mode 100644 index 000000000000..c82cafb92a64 --- /dev/null +++ b/src/AI/samples/Essentials.AI.Sample/App.xaml.cs @@ -0,0 +1,14 @@ +namespace Maui.Controls.Sample; + +public partial class App : Application +{ + public App() + { + InitializeComponent(); + } + + protected override Window CreateWindow(IActivationState? activationState) + { + return new Window(new AppShell()); + } +} \ No newline at end of file diff --git a/src/AI/samples/Essentials.AI.Sample/AppShell.xaml b/src/AI/samples/Essentials.AI.Sample/AppShell.xaml new file mode 100644 index 000000000000..036ee279df00 --- /dev/null +++ b/src/AI/samples/Essentials.AI.Sample/AppShell.xaml @@ -0,0 +1,14 @@ + + + + + + diff --git a/src/AI/samples/Essentials.AI.Sample/AppShell.xaml.cs b/src/AI/samples/Essentials.AI.Sample/AppShell.xaml.cs new file mode 100644 index 000000000000..d9d0dee6c438 --- /dev/null +++ b/src/AI/samples/Essentials.AI.Sample/AppShell.xaml.cs @@ -0,0 +1,15 @@ +using Maui.Controls.Sample.Pages; + +namespace Maui.Controls.Sample; + +public partial class AppShell : Shell +{ + public AppShell() + { + InitializeComponent(); + + // Register routes for navigation + // Only TripPlanningPage is navigable - LandmarkTripView is a child component + Routing.RegisterRoute(nameof(TripPlanningPage), typeof(TripPlanningPage)); + } +} diff --git a/src/AI/samples/Essentials.AI.Sample/Converters/InvertedBoolConverter.cs b/src/AI/samples/Essentials.AI.Sample/Converters/InvertedBoolConverter.cs new file mode 100644 index 000000000000..3862bbd20460 --- /dev/null +++ b/src/AI/samples/Essentials.AI.Sample/Converters/InvertedBoolConverter.cs @@ -0,0 +1,16 @@ +using System.Globalization; + +namespace Maui.Controls.Sample.Converters; + +public class InvertedBoolConverter : IValueConverter +{ + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return value is bool boolValue && !boolValue; + } + + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return value is bool boolValue && !boolValue; + } +} diff --git a/src/AI/samples/Essentials.AI.Sample/Converters/IsNotNullConverter.cs b/src/AI/samples/Essentials.AI.Sample/Converters/IsNotNullConverter.cs new file mode 100644 index 000000000000..d81d737ce8f8 --- /dev/null +++ b/src/AI/samples/Essentials.AI.Sample/Converters/IsNotNullConverter.cs @@ -0,0 +1,16 @@ +using System.Globalization; + +namespace Maui.Controls.Sample.Converters; + +public class IsNotNullConverter : IValueConverter +{ + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return value is not null; + } + + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/src/AI/samples/Essentials.AI.Sample/Converters/IsNotNullOrEmptyConverter.cs b/src/AI/samples/Essentials.AI.Sample/Converters/IsNotNullOrEmptyConverter.cs new file mode 100644 index 000000000000..650da7bb383d --- /dev/null +++ b/src/AI/samples/Essentials.AI.Sample/Converters/IsNotNullOrEmptyConverter.cs @@ -0,0 +1,16 @@ +using System.Globalization; + +namespace Maui.Controls.Sample.Converters; + +public class IsNotNullOrEmptyConverter : IValueConverter +{ + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return value is string str && !string.IsNullOrWhiteSpace(str); + } + + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/src/AI/samples/Essentials.AI.Sample/Directory.Build.targets b/src/AI/samples/Essentials.AI.Sample/Directory.Build.targets new file mode 100644 index 000000000000..fcc6017c6249 --- /dev/null +++ b/src/AI/samples/Essentials.AI.Sample/Directory.Build.targets @@ -0,0 +1,4 @@ + + + + diff --git a/src/AI/samples/Essentials.AI.Sample/Essentials.AI.Sample.csproj b/src/AI/samples/Essentials.AI.Sample/Essentials.AI.Sample.csproj new file mode 100644 index 000000000000..c27e64c3a63b --- /dev/null +++ b/src/AI/samples/Essentials.AI.Sample/Essentials.AI.Sample.csproj @@ -0,0 +1,90 @@ + + + + $(MauiSamplePlatforms) + $(TargetFrameworks);$(MauiSamplePreviousPlatforms) + Maui.Essentials.AI.Sample + Microsoft.Maui.Essentials.AI.Sample + Exe + true + true + false + enable + enable + preview + SourceGen + + maccatalyst-x64 + maccatalyst-arm64 + 2727d4aa-a3a5-484b-9447-91604761972b + + + + Essentials AI + com.microsoft.maui.essentials.ai + 1.0 + 1 + + + + + + + + + + + + + + + + + + $(DefineConstants);ENABLE_OPENAI_CLIENT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $([System.Environment]::GetFolderPath(SpecialFolder.UserProfile))\AppData\Roaming\Microsoft\UserSecrets\$(UserSecretsId)\secrets.json + + + $([System.Environment]::GetFolderPath(SpecialFolder.UserProfile))/.microsoft/usersecrets/$(UserSecretsId)/secrets.json + + + + + + + + + + diff --git a/src/AI/samples/Essentials.AI.Sample/MauiProgram.cs b/src/AI/samples/Essentials.AI.Sample/MauiProgram.cs new file mode 100644 index 000000000000..02290d97b2b7 --- /dev/null +++ b/src/AI/samples/Essentials.AI.Sample/MauiProgram.cs @@ -0,0 +1,99 @@ +using System.Reflection; +using Maui.Controls.Sample.Pages; +using Maui.Controls.Sample.Services; +using Maui.Controls.Sample.ViewModels; +using Microsoft.Extensions.AI; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +#if ENABLE_OPENAI_CLIENT +using System.ClientModel; +using OpenAI; +using OpenAI.Chat; +#endif + +namespace Maui.Controls.Sample; + +public static class MauiProgram +{ + public static bool UseCloudAI = true; + + public static MauiApp CreateMauiApp() + { + var builder = MauiApp.CreateBuilder(); + + builder.Configuration + .AddJsonStream(GetUserSecretsStream() ?? throw new InvalidOperationException("User secrets file not found as embedded resource.")); + + builder.UseMauiApp(); + +#if IOS || ANDROID || MACCATALYST + builder.UseMauiMaps(); +#endif + + builder.ConfigureFonts(fonts => + { + fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); + fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); + }); + + // Register AI + #if ENABLE_OPENAI_CLIENT + if (UseCloudAI) + { + var aiSection = builder.Configuration.GetSection("AI"); + var client = new ChatClient( + credential: new ApiKeyCredential(aiSection["ApiKey"] ?? throw new InvalidOperationException("API Key not found in user secrets.")), + model: aiSection["DeploymentName"] ?? throw new InvalidOperationException("Deployment Name not found in user secrets."), + options: new OpenAIClientOptions() + { + Endpoint = new(aiSection["Endpoint"] ?? throw new InvalidOperationException("Endpoint not found in user secrets.")), + }); + var ichatClient = client.AsIChatClient(); + + builder.Services.AddSingleton(provider => + { + var lf = provider.GetRequiredService(); + var realClient = ichatClient + .AsBuilder() + .UseLogging(lf) + .UseFunctionInvocation() + .Build(); + return realClient; + }); + } + #endif + + // Register Pages + builder.Services.AddTransient(); + builder.Services.AddTransient(); + + // Register ViewModels + builder.Services.AddTransient(); + builder.Services.AddTransient(); + + // Register Services + builder.Services.AddSingleton(sp => LandmarkDataService.Instance); + builder.Services.AddTransient(); + builder.Services.AddTransient(); + builder.Services.AddHttpClient(); + + // Configure Logging + builder.Services.AddLogging(); + builder.Logging.AddDebug(); + builder.Logging.AddConsole(); +#if DEBUG + builder.Logging.SetMinimumLevel(LogLevel.Debug); +#else + builder.Logging.SetMinimumLevel(LogLevel.Information); +#endif + + return builder.Build(); + } + + private static Stream? GetUserSecretsStream() + { + var assembly = Assembly.GetExecutingAssembly(); + var stream = assembly.GetManifestResourceStream("Maui.Essentials.AI.Sample.secrets.json"); + return stream; + } +} diff --git a/src/AI/samples/Essentials.AI.Sample/Models/Itinerary.cs b/src/AI/samples/Essentials.AI.Sample/Models/Itinerary.cs new file mode 100644 index 000000000000..d88be040c450 --- /dev/null +++ b/src/AI/samples/Essentials.AI.Sample/Models/Itinerary.cs @@ -0,0 +1,101 @@ +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; + +namespace Maui.Controls.Sample.Models; + +[DisplayName("Itinerary")] +[Description("A travel itinerary with days and activities.")] +public record Itinerary +{ + [Description("An exciting name for the trip.")] + public required string Title { get; init; } + + public required string DestinationName { get; init; } + + public required string Description { get; init; } + + [Description("An explanation of how the itinerary meets the person's special requests.")] + public required string Rationale { get; init; } + + [Description("A list of day-by-day plans.")] + [Length(3, 3)] + public required List Days { get; init; } + + public static Itinerary GetExampleTripToJapan() => + new() + { + Title = "Onsen Trip to Japan", + DestinationName = "Mt. Fuji", + Description = "Sushi, hot springs, and ryokan with a toddler!", + Rationale = + """ + You are traveling with a child, so climbing Mt. Fuji is probably not an option, + but there is lots to do around Kawaguchiko Lake, including Fujikyu. + I recommend staying in a ryokan because you love hotsprings. + """, + Days = [ + new DayPlan + { + Title = "Sushi and Shopping Near Kawaguchiko", + Subtitle = "Spend your final day enjoying sushi and souvenir shopping.", + Destination = "Kawaguchiko Lake", + Activities = [ + new Activity + { + Type = ActivityKind.FoodAndDining, + Title = "The Restaurant serving Sushi", + Description = "Visit an authentic sushi restaurant for lunch." + }, + new Activity + { + Type = ActivityKind.Shopping, + Title = "The Plaza", + Description = "Enjoy souvenir shopping at various shops." + }, + new Activity + { + Type = ActivityKind.Sightseeing, + Title = "The Beautiful Cherry Blossom Park", + Description = "Admire the beautiful cherry blossom trees in the park." + }, + new Activity + { + Type = ActivityKind.HotelAndLodging, + Title = "The Hotel", + Description = "Spend one final evening in the hotspring before heading home." + }] + }] + }; +} + +[DisplayName("DayPlan")] +public record DayPlan +{ + [Description("A unique and exciting title for this day plan.")] + public required string Title { get; init; } + + public required string Subtitle { get; init; } + + public required string Destination { get; init; } + + [Length(3, 3)] + public required List Activities { get; init; } +} + +[DisplayName("Activity")] +public record Activity +{ + public required ActivityKind Type { get; init; } + + public required string Title { get; init; } + + public required string Description { get; init; } +} + +public enum ActivityKind +{ + Sightseeing, + FoodAndDining, + Shopping, + HotelAndLodging +} diff --git a/src/AI/samples/Essentials.AI.Sample/Models/Landmark.cs b/src/AI/samples/Essentials.AI.Sample/Models/Landmark.cs new file mode 100644 index 000000000000..3d7aafd3b114 --- /dev/null +++ b/src/AI/samples/Essentials.AI.Sample/Models/Landmark.cs @@ -0,0 +1,42 @@ +using System.Text.Json.Serialization; + +namespace Maui.Controls.Sample.Models; + +public record Landmark +{ + [JsonPropertyName("id")] + public int Id { get; init; } + + [JsonPropertyName("name")] + public required string Name { get; init; } + + [JsonPropertyName("continent")] + public required string Continent { get; init; } + + [JsonPropertyName("description")] + public required string Description { get; init; } + + [JsonPropertyName("shortDescription")] + public required string ShortDescription { get; init; } + + [JsonPropertyName("latitude")] + public double Latitude { get; init; } + + [JsonPropertyName("longitude")] + public double Longitude { get; init; } + + [JsonPropertyName("span")] + public double Span { get; init; } + + [JsonPropertyName("placeID")] + public string? PlaceId { get; init; } + + [JsonIgnore] + public string BackgroundImageName => $"{Id}"; + + [JsonIgnore] + public string ThumbnailImageName => $"{Id}_thumb"; + + [JsonIgnore] + public Location Location => new(Latitude, Longitude); +} diff --git a/src/AI/samples/Essentials.AI.Sample/Models/Weather.cs b/src/AI/samples/Essentials.AI.Sample/Models/Weather.cs new file mode 100644 index 000000000000..a2c2c8646a07 --- /dev/null +++ b/src/AI/samples/Essentials.AI.Sample/Models/Weather.cs @@ -0,0 +1,86 @@ +using System.Text.Json.Serialization; + +namespace Maui.Controls.Sample.Models; + +public record WeatherForecast +{ + [JsonPropertyName("latitude")] + public double Latitude { get; init; } + + [JsonPropertyName("longitude")] + public double Longitude { get; init; } + + [JsonPropertyName("daily")] + public DailyWeather Daily { get; init; } = new(); +} + +public record DailyWeather +{ + [JsonPropertyName("time")] + public List Time { get; init; } = []; + + [JsonPropertyName("temperature_2m_mean")] + public List TemperatureMean { get; init; } = []; + + [JsonPropertyName("weather_code")] + public List WeatherCode { get; init; } = []; +} + +public static class WeatherCodeExtensions +{ + public static string GetWeatherEmoji(int code) + { + return code switch + { + 0 => "☀️", + 1 or 2 => "🌤️", + 3 => "☁️", + 45 or 48 => "🌫️", + 51 or 53 or 55 or 56 or 57 => "🌧️", + 61 or 63 or 65 => "🌧️", + 66 or 67 => "🌧️", + 71 or 73 or 75 or 77 => "❄️", + 80 or 81 or 82 => "🌧️", + 85 or 86 => "❄️", + 95 => "⛈️", + 96 or 99 => "⛈️", + _ => "☁️" + }; + } + + public static string GetWeatherDescription(int code) + { + return code switch + { + 0 => "Clear sky", + 1 => "Mainly clear", + 2 => "Partly cloudy", + 3 => "Overcast", + 45 => "Fog", + 48 => "Depositing rime fog", + 51 => "Light drizzle", + 53 => "Moderate drizzle", + 55 => "Dense drizzle", + 56 => "Light freezing drizzle", + 57 => "Dense freezing drizzle", + 61 => "Slight rain", + 63 => "Moderate rain", + 65 => "Heavy rain", + 66 => "Light freezing rain", + 67 => "Heavy freezing rain", + 71 => "Slight snow", + 73 => "Moderate snow", + 75 => "Heavy snow", + 77 => "Snow grains", + 80 => "Slight rain showers", + 81 => "Moderate rain showers", + 82 => "Violent rain showers", + 85 => "Slight snow showers", + 86 => "Heavy snow showers", + 95 => "Thunderstorm", + 96 => "Thunderstorm with slight hail", + 99 => "Thunderstorm with heavy hail", + _ => "Unknown" + }; + } +} diff --git a/src/AI/samples/Essentials.AI.Sample/Pages/LandmarksPage.xaml b/src/AI/samples/Essentials.AI.Sample/Pages/LandmarksPage.xaml new file mode 100644 index 000000000000..6b5c624b5604 --- /dev/null +++ b/src/AI/samples/Essentials.AI.Sample/Pages/LandmarksPage.xaml @@ -0,0 +1,57 @@ + + + + + + + + + + + diff --git a/src/AI/samples/Essentials.AI.Sample/Pages/LandmarksPage.xaml.cs b/src/AI/samples/Essentials.AI.Sample/Pages/LandmarksPage.xaml.cs new file mode 100644 index 000000000000..71fb097ad41e --- /dev/null +++ b/src/AI/samples/Essentials.AI.Sample/Pages/LandmarksPage.xaml.cs @@ -0,0 +1,26 @@ +using Maui.Controls.Sample.Models; +using Maui.Controls.Sample.ViewModels; + +namespace Maui.Controls.Sample.Pages; + +public partial class LandmarksPage : ContentPage +{ + public LandmarksPage(LandmarksViewModel viewModel) + { + InitializeComponent(); + + BindingContext = viewModel; + + Loaded += async (_, _) => await viewModel.InitializeAsync(); + } + + private async void OnLandmarkTapped(object? sender, Landmark landmark) + { + var parameters = new Dictionary + { + { "Landmark", landmark } + }; + + await Shell.Current.GoToAsync(nameof(TripPlanningPage), parameters); + } +} diff --git a/src/AI/samples/Essentials.AI.Sample/Pages/TripPlanningPage.xaml b/src/AI/samples/Essentials.AI.Sample/Pages/TripPlanningPage.xaml new file mode 100644 index 000000000000..1ce3711ec370 --- /dev/null +++ b/src/AI/samples/Essentials.AI.Sample/Pages/TripPlanningPage.xaml @@ -0,0 +1,30 @@ + + + + + + + + + + + + +