Skip to content

Commit a83de86

Browse files
authored
Merge branch 'main' into MediaElementOptionService
2 parents 7aba464 + d625a24 commit a83de86

File tree

14 files changed

+253
-140
lines changed

14 files changed

+253
-140
lines changed

.github/prompts/dotnet/codestyle.prompt.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,12 @@ This guide provides a set of best practices and coding standards for writing C#
581581

582582
### Element Positioning
583583

584-
Please adhere to [Style Cop SA1201](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1201.md) for organizing code in a file.
584+
Please adhere to the following Style Cop rules for organizing code in a file:
585+
- [Style Cop SA1201](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1201.md)
586+
- [Style Cop SA1202](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1202.md)
587+
- [Style Cop SA1204](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1204.md)
588+
- [Style Cop SA1214](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1214.md)
589+
- [Style Cop SA1215](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1215.md)
585590

586591
Elements at the file root level or within a namespace should be positioned in the following order:
587592

.github/workflows/dotnet-build.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -191,13 +191,13 @@ jobs:
191191
run: dotnet build ${{ env.PathToCommunityToolkitSourceGeneratorsInternalCsproj }} -c Release
192192

193193
- name: 'Build CommunityToolkit.Maui.Camera'
194-
run: dotnet build ${{ env.PathToCommunityToolkitCameraCsproj }} -c Release -p:PackageVersion=${{ env.NugetPackageVersionCamera }} -p:Version=${{ env.NugetPackageVersion }}
194+
run: dotnet build ${{ env.PathToCommunityToolkitCameraCsproj }} -c Release -p:PackageVersion=${{ env.NugetPackageVersionCamera }} -p:Version=${{ env.NugetPackageVersionCamera }}
195195

196196
- name: 'Build CommunityToolkit.Maui.MediaElement'
197-
run: dotnet build ${{ env.PathToCommunityToolkitMediaElementCsproj }} -c Release -p:PackageVersion=${{ env.NugetPackageVersionMediaElement }} -p:Version=${{ env.NugetPackageVersion }}
197+
run: dotnet build ${{ env.PathToCommunityToolkitMediaElementCsproj }} -c Release -p:PackageVersion=${{ env.NugetPackageVersionMediaElement }} -p:Version=${{ env.NugetPackageVersionMediaElement }}
198198

199199
- name: 'Build CommunityToolkit.Maui.Maps'
200-
run: dotnet build ${{ env.PathToCommunityToolkitMapsCsproj }} -c Release -p:PackageVersion=${{ env.NugetPackageVersionMaps }} -p:Version=${{ env.NugetPackageVersion }}
200+
run: dotnet build ${{ env.PathToCommunityToolkitMapsCsproj }} -c Release -p:PackageVersion=${{ env.NugetPackageVersionMaps }} -p:Version=${{ env.NugetPackageVersionMaps }}
201201

202202
- name: 'Build CommunityToolkit.Maui.Core'
203203
run: dotnet build ${{ env.PathToCommunityToolkitCoreCsproj }} -c Release -p:PackageVersion=${{ env.NugetPackageVersion }} -p:Version=${{ env.NugetPackageVersion }}
@@ -224,19 +224,19 @@ jobs:
224224
shell: bash
225225

226226
- name: Pack CommunityToolkit.Maui.Core NuGet
227-
run: dotnet pack -c Release ${{ env.PathToCommunityToolkitCoreCsproj }} -p:PackageVersion=${{ env.NugetPackageVersion }}
227+
run: dotnet pack -c Release ${{ env.PathToCommunityToolkitCoreCsproj }} -p:PackageVersion=${{ env.NugetPackageVersion }} -p:Version=${{ env.NugetPackageVersion }}
228228

229229
- name: Pack CommunityToolkit.Maui NuGet
230-
run: dotnet pack -c Release ${{ env.PathToCommunityToolkitCsproj }} -p:PackageVersion=${{ env.NugetPackageVersion }}
230+
run: dotnet pack -c Release ${{ env.PathToCommunityToolkitCsproj }} -p:PackageVersion=${{ env.NugetPackageVersion }} -p:Version=${{ env.NugetPackageVersion }}
231231

232232
- name: Pack CommunityToolkit.Maui.Camera NuGet
233-
run: dotnet pack -c Release ${{ env.PathToCommunityToolkitCameraCsproj }} -p:PackageVersion=${{ env.NugetPackageVersionCamera }}
233+
run: dotnet pack -c Release ${{ env.PathToCommunityToolkitCameraCsproj }} -p:PackageVersion=${{ env.NugetPackageVersionCamera }} -p:Version=${{ env.NugetPackageVersionCamera }}
234234

235235
- name: Pack CommunityToolkit.Maui.MediaElement NuGet
236-
run: dotnet pack -c Release ${{ env.PathToCommunityToolkitMediaElementCsproj }} -p:PackageVersion=${{ env.NugetPackageVersionMediaElement }}
236+
run: dotnet pack -c Release ${{ env.PathToCommunityToolkitMediaElementCsproj }} -p:PackageVersion=${{ env.NugetPackageVersionMediaElement }} -p:Version=${{ env.NugetPackageVersionMediaElement }}
237237

238238
- name: Pack CommunityToolkit.Maui.Maps NuGet
239-
run: dotnet pack -c Release ${{ env.PathToCommunityToolkitMapsCsproj }} -p:PackageVersion=${{ env.NugetPackageVersionMaps }}
239+
run: dotnet pack -c Release ${{ env.PathToCommunityToolkitMapsCsproj }} -p:PackageVersion=${{ env.NugetPackageVersionMaps }} -p:Version=${{ env.NugetPackageVersionMaps }}
240240

241241
- name: Copy NuGet Packages to Staging Directory
242242
if: ${{ runner.os == 'Windows' }} && !startsWith(github.ref, 'refs/tags/')

Directory.Build.props

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<NuGetAuditMode>all</NuGetAuditMode>
1717

1818
<!-- MAUI Specific -->
19-
<MauiPackageVersion>9.0.80</MauiPackageVersion>
19+
<MauiPackageVersion>9.0.90</MauiPackageVersion>
2020
<NextMauiPackageVersion>10.0.0</NextMauiPackageVersion>
2121
<MauiStrictXamlCompilation>true</MauiStrictXamlCompilation>
2222
<SkipValidateMauiImplicitPackageReferences>true</SkipValidateMauiImplicitPackageReferences>
@@ -240,4 +240,4 @@
240240
<PropertyGroup Condition="('$(TF_BUILD)' == 'true' OR '$(GITHUB_ACTIONS)' == 'true') and $([MSBuild]::IsOSPlatform('windows')) == 'true'">
241241
<IncludeTizenTargetFrameworks>true</IncludeTizenTargetFrameworks>
242242
</PropertyGroup>
243-
</Project>
243+
</Project>

README.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,32 @@ All of the [documentation](https://learn.microsoft.com/dotnet/communitytoolkit/m
1818

1919
https://learn.microsoft.com/dotnet/communitytoolkit/maui/get-started
2020

21+
## Installation
22+
23+
The release versions of .NET MAUI Community Toolkit are available at Nuget.org as NuGet packages. You can install them using the following commands in your terminal or Package Manager Console:
24+
25+
```bash
26+
dotnet add package CommunityToolkit.Maui
27+
dotnet add package CommunityToolkit.Maui.MediaElement
28+
dotnet add package CommunityToolkit.Maui.Maps
29+
dotnet add package CommunityToolkit.Maui.Camera
30+
```
31+
32+
You can also try the latest pre-release version of the main branch. We use GitHub Packages to host the pre-release versions of the .NET MAUI Community Toolkit. To install the pre-release version, you need to add the GitHub Packages source to your NuGet configuration. GitHub Packages only supports authentication using a personal access token (classic) (https://github.com/settings/tokens). For more information, see [Managing your personal access tokens](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token). You can use a personal access token (classic) to authenticate to GitHub Packages. When you create a personal access token (classic), you can assign the token different scopes depending on your needs, but `read:packages` is enough.
33+
34+
```bash
35+
dotnet nuget add source https://nuget.pkg.github.com/CommunityToolkit/index.json -n CommunityToolkitGitHubNuget -u YOUR_GITHUB_USERNAME -p YOUR_GITHUB_PERSONAL_ACCESS_TOKEN
36+
```
37+
38+
and then install the packages as follows:
39+
40+
```bash
41+
dotnet add package CommunityToolkit.Maui --version 99.0.0-preview980
42+
dotnet add package CommunityToolkit.Maui.MediaElement --version 99.0.0-preview980
43+
dotnet add package CommunityToolkit.Maui.Maps --version 99.0.0-preview980
44+
dotnet add package CommunityToolkit.Maui.Camera --version 99.0.0-preview980
45+
```
46+
2147
## Getting Started
2248

2349
In order to use the .NET MAUI Community Toolkit you need to call the extension method in your `MauiProgram.cs` file as follows:

samples/CommunityToolkit.Maui.Sample/Pages/Views/MediaElement/MediaElementPage.xaml.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ async void DisplayPopup(object sender, EventArgs e)
285285

286286
await this.ShowPopupAsync(popupMediaElement);
287287

288-
popupMediaElement.Stop();
289-
popupMediaElement.Source = null;
288+
popupMediaElement.Stop();
289+
popupMediaElement.Source = null;
290290
}
291291
}

samples/CommunityToolkit.Maui.Sample/ViewModels/Views/Popup/ComplexPopupViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ public partial class ComplexPopupViewModel(IPopupService popupService) : Observa
77
{
88
readonly IPopupService popupService = popupService;
99
readonly INavigation navigation = Application.Current?.Windows[0].Page?.Navigation ?? throw new InvalidOperationException("Unable to locate INavigation");
10-
10+
1111
[ObservableProperty, NotifyCanExecuteChangedFor(nameof(ReturnButtonTappedCommand))]
1212
public partial string ReturnText { get; set; } = string.Empty;
1313

src/CommunityToolkit.Maui.UnitTests/Extensions/AppBuilderExtensionsTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public void UseMauiCommunityToolkit_ShouldAssignValues()
110110
Shadow = null,
111111
Shape = null
112112
};
113-
113+
114114
Core.AppBuilderExtensions.ShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted += HandleShouldUseStatusBarBehaviorOnAndroidModalPageOptionCompleted;
115115

116116
// Act

src/CommunityToolkit.Maui.UnitTests/Extensions/PopupExtensionsTests.cs

Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using CommunityToolkit.Maui.UnitTests.Services;
66
using CommunityToolkit.Maui.Views;
77
using Microsoft.Maui.Controls.Shapes;
8+
using Nito.AsyncEx;
89
using Xunit;
910

1011
namespace CommunityToolkit.Maui.UnitTests.Extensions;
@@ -1162,8 +1163,14 @@ public async Task ShowPopupAsync_ReferenceTypeShouldReturnNull_WhenPopupTapGestu
11621163
var popupPage = (PopupPage)navigation.ModalStack[0];
11631164
popupPage.PopupClosed += HandlePopupClosed;
11641165

1165-
var tapGestureRecognizer = GetTapOutsideGestureRecognizer(popupPage);
1166-
tapGestureRecognizer.Command?.Execute(null);
1166+
try
1167+
{
1168+
// Run using AsyncContext to catch Exception thrown by fire-and-forget ICommand.Execute
1169+
AsyncContext.Run(() => Assert.True(popupPage.TryExecuteTapOutsideOfPopupCommand()));
1170+
}
1171+
catch (PopupNotFoundException) // PopupNotFoundException is expected here because `ShowPopup` was never called
1172+
{
1173+
}
11671174

11681175
var popupClosedResult = await popupClosedTCS.Task;
11691176
var showPopupResult = await showPopupTask;
@@ -1197,8 +1204,14 @@ public async Task ShowPopupAsync_Shell_ReferenceTypeShouldReturnNull_WhenPopupTa
11971204
var popupPage = (PopupPage)shellNavigation.ModalStack[0];
11981205
popupPage.PopupClosed += HandlePopupClosed;
11991206

1200-
var tapGestureRecognizer = GetTapOutsideGestureRecognizer(popupPage);
1201-
tapGestureRecognizer.Command?.Execute(null);
1207+
try
1208+
{
1209+
// Run using AsyncContext to catch Exception thrown by fire-and-forget ICommand.Execute
1210+
AsyncContext.Run(() => Assert.True(popupPage.TryExecuteTapOutsideOfPopupCommand()));
1211+
}
1212+
catch (PopupNotFoundException) // PopupNotFoundException is expected here because `ShowPopup` was never called
1213+
{
1214+
}
12021215

12031216
var popupClosedResult = await popupClosedTCS.Task;
12041217
var showPopupResult = await showPopupTask;
@@ -1225,8 +1238,14 @@ public async Task ShowPopupAsync_NullableValueTypeShouldReturnResult_WhenPopupIs
12251238
var popupPage = (PopupPage)navigation.ModalStack[0];
12261239
popupPage.PopupClosed += HandlePopupClosed;
12271240

1228-
var tapGestureRecognizer = GetTapOutsideGestureRecognizer(popupPage);
1229-
tapGestureRecognizer.Command?.Execute(null);
1241+
try
1242+
{
1243+
// Run using AsyncContext to catch Exception thrown by fire-and-forget ICommand.Execute
1244+
AsyncContext.Run(() => Assert.True(popupPage.TryExecuteTapOutsideOfPopupCommand()));
1245+
}
1246+
catch (PopupNotFoundException) // PopupNotFoundException is expected here because `ShowPopup` was never called
1247+
{
1248+
}
12301249

12311250
var popupClosedResult = await popupClosedTCS.Task;
12321251
var showPopupResult = await showPopupTask;
@@ -1260,8 +1279,14 @@ public async Task ShowPopupAsync_Shell_NullableValueTypeShouldReturnResult_WhenP
12601279
var popupPage = (PopupPage)shellNavigation.ModalStack[0];
12611280
popupPage.PopupClosed += HandlePopupClosed;
12621281

1263-
var tapGestureRecognizer = GetTapOutsideGestureRecognizer(popupPage);
1264-
tapGestureRecognizer.Command?.Execute(null);
1282+
try
1283+
{
1284+
// Run using AsyncContext to catch Exception thrown by fire-and-forget ICommand.Execute
1285+
AsyncContext.Run(() => Assert.True(popupPage.TryExecuteTapOutsideOfPopupCommand()));
1286+
}
1287+
catch (PopupNotFoundException) // PopupNotFoundException is expected here because `ShowPopup` was never called
1288+
{
1289+
}
12651290

12661291
var popupClosedResult = await popupClosedTCS.Task;
12671292
var showPopupResult = await showPopupTask;
@@ -1288,8 +1313,14 @@ public async Task ShowPopupAsync_ValueTypeShouldReturnResult_WhenPopupIsClosedBy
12881313
var popupPage = (PopupPage)navigation.ModalStack[0];
12891314
popupPage.PopupClosed += HandlePopupClosed;
12901315

1291-
var tapGestureRecognizer = GetTapOutsideGestureRecognizer(popupPage);
1292-
tapGestureRecognizer.Command?.Execute(null);
1316+
try
1317+
{
1318+
// Run using AsyncContext to catch Exception thrown by fire-and-forget ICommand.Execute
1319+
AsyncContext.Run(() => Assert.True(popupPage.TryExecuteTapOutsideOfPopupCommand()));
1320+
}
1321+
catch (PopupNotFoundException) // PopupNotFoundException is expected here because `ShowPopup` was never called
1322+
{
1323+
}
12931324

12941325
var popupClosedResult = await popupClosedTCS.Task;
12951326
var showPopupResult = await showPopupTask;
@@ -1324,8 +1355,14 @@ public async Task ShowPopupAsync_Shell_ValueTypeShouldReturnResult_WhenPopupIsCl
13241355
var popupPage = (PopupPage)shellNavigation.ModalStack[0];
13251356
popupPage.PopupClosed += HandlePopupClosed;
13261357

1327-
var tapGestureRecognizer = GetTapOutsideGestureRecognizer(popupPage);
1328-
tapGestureRecognizer.Command?.Execute(null);
1358+
try
1359+
{
1360+
// Run using AsyncContext to catch Exception thrown by fire-and-forget ICommand.Execute
1361+
AsyncContext.Run(() => Assert.True(popupPage.TryExecuteTapOutsideOfPopupCommand()));
1362+
}
1363+
catch (PopupNotFoundException) // PopupNotFoundException is expected here because `ShowPopup` was never called
1364+
{
1365+
}
13291366

13301367
var popupClosedResult = await popupClosedTCS.Task;
13311368
var showPopupResult = await showPopupTask;
@@ -1472,9 +1509,6 @@ public async Task ShowPopupAsync_TaskShouldCompleteWhenCloseAsyncIsCalled()
14721509
Assert.Equal(expectedResult, popupResult.Result);
14731510
Assert.False(popupResult.WasDismissedByTappingOutsideOfPopup);
14741511
}
1475-
1476-
static TapGestureRecognizer GetTapOutsideGestureRecognizer(PopupPage popupPage) =>
1477-
(TapGestureRecognizer)popupPage.Content.Children.OfType<BoxView>().Single().GestureRecognizers[0];
14781512
}
14791513

14801514
sealed class ViewWithIQueryAttributable : Button, IQueryAttributable

0 commit comments

Comments
 (0)