Skip to content

Fix duplicate screen reader announcements in Color page copy buttons#2091

Merged
marcelwgn merged 2 commits intomainfrom
copilot/fix-screen-reader-announcement
Dec 20, 2025
Merged

Fix duplicate screen reader announcements in Color page copy buttons#2091
marcelwgn merged 2 commits intomainfrom
copilot/fix-screen-reader-announcement

Conversation

Copy link
Contributor

Copilot AI commented Dec 18, 2025

Screen readers announce "Brush name copied to clipboard, Copied to clipboard" when copying color brush names - the message is duplicated because both CopyButton's internal handler and ColorTile's custom handler trigger accessibility announcements.

Changes

  • CopyButton: Add CopiedMessage dependency property to allow customization of the announcement (defaults to "Copied to clipboard")
  • ColorTile: Set CopiedMessage="Brush name copied to clipboard" on the button, remove duplicate UIHelper.AnnounceActionForAccessibility call

Example

<local:CopyButton
    Click="CopyBrushNameButton_Click"
    CopiedMessage="Brush name copied to clipboard"
    Content="&#xE8C8;" />
private void CopyBrushNameButton_Click(object sender, RoutedEventArgs e)
{
    DataPackage package = new DataPackage();
    package.SetText(ColorBrushName);
    Clipboard.SetContent(package);
    // Announcement now handled by CopyButton using CopiedMessage property
}

Applies to all color sections (Text, Signal, Fill, Background, Stroke, HighContrast).

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • 0t3vsblobprodcus362.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/EB23B7D1B15B85081672081E55C17E18/missingpackages_workingdir --packages /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 1p7vsblobprodcus324.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/E25CD4A82AF7DCCAC78C9E3EDD9CC1BB/missingpackages_workingdir --packages /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 51yvsblobprodcus36.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/A5067618043C36E803E5020505C5E40F/missingpackages_workingdir --packages /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 6s7vsblobprodcus313.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/7F0AD5B89EC078FE77CFD6BDA2F52E08/missingpackages_workingdir --packages /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 96bvsblobprodcus338.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/WinUI-Gallery/WinUI-Gallery/tests/WinUIGallery.UITests/WinUIGallery.UITests.csproj --packages /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot (dns block)
  • e7bvsblobprodcus348.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet build WinUIGallery/WinUIGallery.csproj --configuration Release (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore WinUIGallery/WinUIGallery.csproj (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/WinUI-Gallery/WinUI-Gallery/WinUIGallery.sln --packages /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot (dns block)
  • gbsvsblobprodcus365.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/7C8EA345233C92F4CB2BB9658BB2AA46/missingpackages_workingdir --packages /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • ibzvsblobprodcus369.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/WinUI-Gallery/WinUI-Gallery/tests/WinUIGallery.UITests/WinUIGallery.UITests.csproj --packages /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot (dns block)
  • jd4vsblobprodcus366.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/DE17E2442CB5BCCE3B8E9B4256A655B4/missingpackages_workingdir --packages /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • k4kvsblobprodcus344.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/AFED770A6C82C3D0C8515A8A32ECB221/missingpackages_workingdir --packages /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force sharp/working/emptyFakeDotnetRoot csharp/working/emptyFakeDotnetRoot (dns block)
  • kmuvsblobprodcus389.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/0A8D2B0114395BB81780675AAD5BD541/missingpackages_workingdir --packages /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • ofvvsblobprodcus315.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/C1A6874189F3A3E4F1A43CCA7F065BAD/missingpackages_workingdir --packages /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • pkvvsblobprodcus321.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/WinUI-Gallery/WinUI-Gallery/tests/WinUIGallery.UITests/WinUIGallery.UITests.csproj --packages /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot (dns block)
  • uy6vsblobprodcus34.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/9385D6F79C8C3B1189EF0A92FFB71E10/missingpackages_workingdir --packages /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • vb4vsblobprodcus33.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/2BA3A66AC79FC725BB64C9C1AA39E377/missingpackages_workingdir --packages /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • vwvvsblobprodcus334.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/780211A2D4C6297318C9E18BBEC72052/missingpackages_workingdir --packages /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • ytvvsblobprodcus310.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/WinUI-Gallery/WinUI-Gallery/tests/WinUIGallery.UITests/WinUIGallery.UITests.csproj --packages /home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/WinUI-Gallery/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Original prompt

This section details on the original issue you should resolve

<issue_title>On invoking 'Copy brush name' button, Screen reader is announcing the 'Copied to clipboard' success message twice.</issue_title>
<issue_description>### Which version of the app?

WinUI 3 Gallery

Description

Environment Details:
OS Version: 24H2 (OS Build 26100.4315)
App: WinUI 3 Gallery
App Version: 2.6.0.0 (SDK 1.7)
AT: Screen reader

Pre-Requisite:
Turn on Narrator with shortcut key "win+ctrl+Enter" key.

Repro Steps:
Launch the WinUI 3 Gallery app.
Navigate to search box using tab key.
Type 'Color' in search box and hit enter.
Navigate to 'Color' card and activate it.
Navigate to 'Text' list item and select it.
Navigate to 'Copy brush name' button and invoke it.
Now listen to the screen reader announcement
Actual Result:
On invoking 'Copy brush name' button, Screen reader is announcing the 'Copied to clipboard' success message twice. It is announcing as "Brush name copied to clipboard, Copied to clipboard"

Note: Issue is observed in entire component

Expected Result:
On invoking 'Copy brush name' button, Screen reader should announce the success message only once. It should announce like 'Brush name copied to clipboard'.

User Impact:
Users with visual impairments who rely on screen reader will face difficulties, if copied success message information announcing twice

“Have feedback on bugs logged, please tag bug as “A11yRCA” and add your feedback in the comment section.”

Screenshots

No response

Windows version

Windows 11 24H2 (26100)

Additional context

No response</issue_description>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Co-authored-by: ayushjai19 <244442986+ayushjai19@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix screen reader announcing copied message twice Fix duplicate screen reader announcements in Color page copy buttons Dec 18, 2025
Copilot AI requested a review from ayushjai19 December 18, 2025 12:11
@ayushjai19 ayushjai19 marked this pull request as ready for review December 18, 2025 12:50
@marcelwgn
Copy link
Contributor

/azp run

@marcelwgn marcelwgn enabled auto-merge (squash) December 20, 2025 12:40
@marcelwgn marcelwgn merged commit 3b6ff8f into main Dec 20, 2025
4 checks passed
@marcelwgn marcelwgn deleted the copilot/fix-screen-reader-announcement branch December 20, 2025 12:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

On invoking 'Copy brush name' button, Screen reader is announcing the 'Copied to clipboard' success message twice.

3 participants