Browse Source

Include ApplicationIcon as a resource for default Window icon (#15298)

* [Windows] Inherit default Window icon from the Process resources

* Include ApplicationIcon as a AvaloniaResource and use it as a default icon

* Revert "[Windows] Inherit default Window icon from the Process resources"

This reverts commit b08f5d52cc.

* Safer LoadDefaultIcon

* Rename !AppIcon to !__AvaloniaDefaultWindowIcon

* Even safer LoadDefaultIcon (for tests)
release/11.1.0-beta2
Max Katz 2 years ago
parent
commit
a8a519d987
  1. 12
      packages/Avalonia/AvaloniaBuildTasks.targets
  2. 18
      src/Avalonia.Controls/Window.cs

12
packages/Avalonia/AvaloniaBuildTasks.targets

@ -3,9 +3,8 @@
<AvaloniaXamlReportImportance Condition="'$(AvaloniaXamlReportImportance)' == ''">low</AvaloniaXamlReportImportance>
<_AvaloniaSkipXamlCompilation Condition="'$(_AvaloniaSkipXamlCompilation)' == ''">false</_AvaloniaSkipXamlCompilation>
<AvaloniaUseCompiledBindingsByDefault Condition="'$(AvaloniaUseCompiledBindingsByDefault)' == ''">false</AvaloniaUseCompiledBindingsByDefault>
<AvaloniaIncludeApplicationIconAsWindowIcon Condition="'$(AvaloniaIncludeApplicationIconAsWindowIcon)' == ''">true</AvaloniaIncludeApplicationIconAsWindowIcon>
</PropertyGroup>
<PropertyGroup>
<!-- Enable property page if VisualStudioVersion is great or equal 17.0 and Language is'not VB.NET -->
@ -31,7 +30,14 @@
<None Remove="**\*.axaml" />
<None Remove="**\*.paml" />
</ItemGroup>
<!-- Include App icon, so we can use it as a default Window icon. -->
<ItemGroup Condition="'$(AvaloniaIncludeApplicationIconAsWindowIcon)' == 'true'">
<AvaloniaResource Include="$(ApplicationIcon)"
Link="!__AvaloniaDefaultWindowIcon"
Condition="'$(ApplicationIcon)' != ''" />
</ItemGroup>
<UsingTask TaskName="GenerateAvaloniaResourcesTask"
AssemblyFile="$(AvaloniaBuildTasksLocation)"
/>

18
src/Avalonia.Controls/Window.cs

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Avalonia.Automation.Peers;
using Avalonia.Controls.Platform;
@ -87,6 +88,7 @@ namespace Avalonia.Controls
/// </summary>
public class Window : WindowBase, IFocusScope, ILayoutRoot
{
private static readonly Lazy<WindowIcon?> s_defaultIcon = new(LoadDefaultIcon);
private readonly List<(Window child, bool isDialog)> _children = new List<(Window, bool)>();
private bool _isExtendedIntoWindowDecorations;
private Thickness _windowDecorationMargin;
@ -228,7 +230,7 @@ namespace Avalonia.Controls
this.GetObservable(ClientSizeProperty).Skip(1).Subscribe(x => PlatformImpl?.Resize(x, WindowResizeReason.Application));
CreatePlatformImplBinding(TitleProperty, title => PlatformImpl!.SetTitle(title));
CreatePlatformImplBinding(IconProperty, icon => PlatformImpl!.SetIcon(icon?.PlatformImpl));
CreatePlatformImplBinding(IconProperty, icon => PlatformImpl!.SetIcon((icon ?? s_defaultIcon.Value)?.PlatformImpl));
CreatePlatformImplBinding(CanResizeProperty, canResize => PlatformImpl!.CanResize(canResize));
CreatePlatformImplBinding(ShowInTaskbarProperty, show => PlatformImpl!.ShowTaskbarIcon(show));
@ -1100,5 +1102,19 @@ namespace Avalonia.Controls
{
return new WindowAutomationPeer(this);
}
private static WindowIcon? LoadDefaultIcon()
{
// Use AvaloniaLocator instead of static AssetLoader, so it won't fail on Unit Tests without any asset loader.
if (AvaloniaLocator.Current.GetService<IAssetLoader>() is { } assetLoader
&& Assembly.GetEntryAssembly()?.GetName()?.Name is { } assemblyName
&& Uri.TryCreate($"avares://{assemblyName}/!__AvaloniaDefaultWindowIcon", UriKind.Absolute, out var path)
&& assetLoader.Exists(path))
{
using var stream = assetLoader.Open(path);
return new WindowIcon(stream);
}
return null;
}
}
}

Loading…
Cancel
Save