mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-03 01:36:31 +02:00
<!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? --> ## Summary of the Pull Request Migrate WPF/WinForms utility to WinUI3 can give us many benefit. 1. Only WinUI3 support AOT. By this change, we can remove the blocker to make imageResizer publish with AOT enabled to improve the performance. Through the previous testing in CmdPal, it can improve about 1.5x to 3x perf. 2. WinUI 3 provides a modern UI and makes sure that our experiences fit in with the Windows 11 look and feel. 3. We can merge many redundant code to the same one and reduce more codebase and installed size in the future if we successfully migrate all remaining WPF/WinForms utility to WinUI3. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [x] Closes: #46465 <!-- - [ ] Closes: #yyy (add separate lines for additional resolved issues) --> - [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [x] **Tests:** Added/updated and all pass - [x] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed 1. Set up the ImageResizer as the startup project. 2. Start in visual studio. --------- Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com> Co-authored-by: Niels Laute <niels.laute@live.nl> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
119 lines
4.1 KiB
C#
119 lines
4.1 KiB
C#
#pragma warning disable IDE0073
|
|
// Copyright (c) Brice Lambson
|
|
// The Brice Lambson licenses this file to you under the MIT license.
|
|
// See the LICENSE file in the project root for more information. Code forked from Brice Lambson's https://github.com/bricelam/ImageResizer/
|
|
#pragma warning restore IDE0073
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Specialized;
|
|
using System.ComponentModel;
|
|
using System.IO;
|
|
using System.IO.Abstractions;
|
|
using System.Threading.Tasks;
|
|
|
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
|
|
using Windows.Graphics.Imaging;
|
|
|
|
[module: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1636:FileHeaderCopyrightTextMustMatch", Justification = "File created under PowerToys.")]
|
|
|
|
namespace ImageResizer.Test
|
|
{
|
|
internal static class AssertEx
|
|
{
|
|
private static readonly IFileSystem _fileSystem = new FileSystem();
|
|
|
|
public static void All<T>(IEnumerable<T> collection, Action<T> action)
|
|
{
|
|
foreach (var item in collection)
|
|
{
|
|
action(item);
|
|
}
|
|
}
|
|
|
|
public static async Task ImageAsync(string path, Action<BitmapDecoder> action)
|
|
{
|
|
using var stream = _fileSystem.File.OpenRead(path);
|
|
var winrtStream = stream.AsRandomAccessStream();
|
|
var decoder = await BitmapDecoder.CreateAsync(winrtStream);
|
|
action(decoder);
|
|
}
|
|
|
|
public static async Task ImageAsync(string path, Func<BitmapDecoder, Task> action)
|
|
{
|
|
using var stream = _fileSystem.File.OpenRead(path);
|
|
var winrtStream = stream.AsRandomAccessStream();
|
|
var decoder = await BitmapDecoder.CreateAsync(winrtStream);
|
|
await action(decoder);
|
|
}
|
|
|
|
public static RaisedEvent<NotifyCollectionChangedEventArgs> Raises<T>(
|
|
Action<NotifyCollectionChangedEventHandler> attach,
|
|
Action<NotifyCollectionChangedEventHandler> detach,
|
|
Action testCode)
|
|
where T : NotifyCollectionChangedEventArgs
|
|
{
|
|
RaisedEvent<NotifyCollectionChangedEventArgs> raisedEvent = null;
|
|
NotifyCollectionChangedEventHandler handler = (sender, e)
|
|
=> raisedEvent = new RaisedEvent<NotifyCollectionChangedEventArgs>(sender, e);
|
|
attach(handler);
|
|
testCode();
|
|
detach(handler);
|
|
|
|
Assert.IsNotNull(raisedEvent);
|
|
|
|
return raisedEvent;
|
|
}
|
|
|
|
public static RaisedEvent<PropertyChangedEventArgs> Raises<T>(
|
|
Action<PropertyChangedEventHandler> attach,
|
|
Action<PropertyChangedEventHandler> detach,
|
|
Action testCode)
|
|
where T : PropertyChangedEventArgs
|
|
{
|
|
RaisedEvent<PropertyChangedEventArgs> raisedEvent = null;
|
|
PropertyChangedEventHandler handler = (sender, e)
|
|
=> raisedEvent = new RaisedEvent<PropertyChangedEventArgs>(sender, e);
|
|
attach(handler);
|
|
testCode();
|
|
detach(handler);
|
|
|
|
Assert.IsNotNull(raisedEvent);
|
|
|
|
return raisedEvent;
|
|
}
|
|
|
|
public static IList<RaisedEvent<PropertyChangedEventArgs>> RaisesAll<T>(
|
|
Action<PropertyChangedEventHandler> attach,
|
|
Action<PropertyChangedEventHandler> detach,
|
|
Action testCode)
|
|
where T : PropertyChangedEventArgs
|
|
{
|
|
var events = new List<RaisedEvent<PropertyChangedEventArgs>>();
|
|
PropertyChangedEventHandler handler = (sender, e)
|
|
=> events.Add(new RaisedEvent<PropertyChangedEventArgs>(sender, e));
|
|
attach(handler);
|
|
testCode();
|
|
detach(handler);
|
|
|
|
Assert.IsTrue(events.Count > 0, "Expected at least one PropertyChanged event.");
|
|
|
|
return events;
|
|
}
|
|
|
|
public sealed class RaisedEvent<TArgs>
|
|
{
|
|
public RaisedEvent(object sender, TArgs args)
|
|
{
|
|
Sender = sender;
|
|
Arguments = args;
|
|
}
|
|
|
|
public object Sender { get; }
|
|
|
|
public TArgs Arguments { get; }
|
|
}
|
|
}
|
|
}
|