AvaloniaUI / Avalonia

Develop Desktop, Embedded, Mobile and WebAssembly apps with C# and XAML. The most popular .NET UI client technology
https://avaloniaui.net
MIT License
25.18k stars 2.18k forks source link

Make asset loader understand files tailored per scale, theme and possibly other #9354

Open maxkatz6 opened 1 year ago

maxkatz6 commented 1 year ago

Describe the solution you'd like

Usage: Create files:

\Assets\Images\logo.scale-100.png
\Assets\Images\logo.scale-200.png
\Assets\Images\logo.scale-400.png

Reference file in the XAML (or with AssetLoader):

<Image Source="\Assets\Images\logo.png"/>

Asset loader should automatically detect current scaling and choose the correct file.

At minimum should be supported:

Describe alternatives you've considered

OnPlatform markup extension will be part of 11.0. Similarly, developers can define their own custom markup extensions. Media Queries also are planned to solve similar problem. Gladly, asset loader extension, won't conflict with these other features, and can be used together.

maxkatz6 commented 1 year ago

See https://github.com/AvaloniaUI/Avalonia/discussions/9291#discussioncomment-3991602

kekekeks commented 1 year ago

I'm not quite sure if that's a job of the asset loader. Especially since scaling can be changed by moving a window to a different monitor.

timunie commented 1 year ago

I want to be able to disable or enable this feature. So if I have localized images for example, I want to decide when to show which one.

TomEdwardsEnscape commented 1 year ago

Some of these features intersect the changes I made for #12107.

  1. Multi-resolution images: IconBitmap. The same technique can be applied to any collection of bitmaps, not just icons.
  2. Theme variant switching: BitmapResourceExtension and the existing theme variant resource system.
Gillibald commented 4 months ago

We should move toward refactoring bitmap usage to a BitmapSource like WPF's version. The BitmapSource is then responsible for providing the correct bitmap representation.

AssetLoader just needs to expose a list of assets at given location and we need a way to read bitmap headers without loading the whole bitmap.