diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 9e453d8..55696a2 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -17,6 +17,7 @@ body: attributes: label: Package options: + - "Media.Image" - "UI" - "UI.Controls.ChipBox" - "UI.Controls.DropDownList" diff --git a/MADE-Uno.sln b/MADE-Uno.sln index 3a42eb6..fd10ad6 100644 --- a/MADE-Uno.sln +++ b/MADE-Uno.sln @@ -45,6 +45,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MADE.UI.Controls.RichEditTo EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MADE.UI.Data.Converters", "src\MADE.UI.Data.Converters\MADE.UI.Data.Converters.csproj", "{55D12223-8B53-4EC7-8CD2-05FC8A84BA7C}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MADE.Media.Image", "src\MADE.Media.Image\MADE.Media.Image.csproj", "{16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution samples\MADE.Samples\MADE.Samples.Shared\MADE.Samples.Shared.projitems*{04f1b32d-9056-43fc-b4c2-b8c5481bdacb}*SharedItemsImports = 4 @@ -1176,6 +1178,76 @@ Global {55D12223-8B53-4EC7-8CD2-05FC8A84BA7C}.Release|x64.Build.0 = Release|Any CPU {55D12223-8B53-4EC7-8CD2-05FC8A84BA7C}.Release|x86.ActiveCfg = Release|Any CPU {55D12223-8B53-4EC7-8CD2-05FC8A84BA7C}.Release|x86.Build.0 = Release|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Ad-Hoc|ARM64.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Ad-Hoc|ARM64.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.AppStore|ARM.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.AppStore|ARM64.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.AppStore|ARM64.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.AppStore|iPhone.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.AppStore|x64.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.AppStore|x64.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.AppStore|x86.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.AppStore|x86.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Debug|ARM.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Debug|ARM.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Debug|ARM64.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Debug|iPhone.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Debug|x64.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Debug|x64.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Debug|x86.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Debug|x86.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Package|Any CPU.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Package|Any CPU.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Package|ARM.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Package|ARM.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Package|ARM64.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Package|ARM64.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Package|iPhone.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Package|iPhone.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Package|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Package|iPhoneSimulator.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Package|x64.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Package|x64.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Package|x86.ActiveCfg = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Package|x86.Build.0 = Debug|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Release|Any CPU.Build.0 = Release|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Release|ARM.ActiveCfg = Release|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Release|ARM.Build.0 = Release|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Release|ARM64.ActiveCfg = Release|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Release|ARM64.Build.0 = Release|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Release|iPhone.ActiveCfg = Release|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Release|iPhone.Build.0 = Release|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Release|x64.ActiveCfg = Release|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Release|x64.Build.0 = Release|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Release|x86.ActiveCfg = Release|Any CPU + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1199,6 +1271,7 @@ Global {D1A16208-5A34-4CC1-B175-01B5AC99E69E} = {01380FB8-F8A7-4416-AABA-5407574B7723} {258FB310-DC02-488C-97C7-CD1226EAAEC8} = {01380FB8-F8A7-4416-AABA-5407574B7723} {55D12223-8B53-4EC7-8CD2-05FC8A84BA7C} = {01380FB8-F8A7-4416-AABA-5407574B7723} + {16E2F926-DDD8-4FBC-85DC-23ACBFCD483C} = {01380FB8-F8A7-4416-AABA-5407574B7723} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3921AD86-E6C0-4436-8880-2D9EDFAD6151} diff --git a/README.md b/README.md index 47fad9f..d75b58a 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ As many developers know, projects like MADE Uno are built and maintained in spar | Package | Current | Preview | Downloads | | ------ | ------ | ------ | ------ | +| Media.Image | [![NuGet](https://img.shields.io/nuget/v/MADE.Media.Image)](https://www.nuget.org/packages/MADE.Media.Image/) | [![NuGet](https://img.shields.io/nuget/vpre/MADE.Media.Image)](https://www.nuget.org/packages/MADE.Media.Image/) | [![NuGet Downloads](https://img.shields.io/nuget/dt/MADE.Media.Image.svg)](https://www.nuget.org/packages/MADE.Media.Image) | | UI | [![NuGet](https://img.shields.io/nuget/v/MADE.UI)](https://www.nuget.org/packages/MADE.UI/) | [![NuGet](https://img.shields.io/nuget/vpre/MADE.UI)](https://www.nuget.org/packages/MADE.UI/) | [![NuGet Downloads](https://img.shields.io/nuget/dt/MADE.UI.svg)](https://www.nuget.org/packages/MADE.UI) | | UI.Controls.ChipBox | [![NuGet](https://img.shields.io/nuget/v/MADE.UI.Controls.ChipBox)](https://www.nuget.org/packages/MADE.UI.Controls.ChipBox/) | [![NuGet](https://img.shields.io/nuget/vpre/MADE.UI.Controls.ChipBox)](https://www.nuget.org/packages/MADE.UI.Controls.ChipBox/) | [![NuGet Downloads](https://img.shields.io/nuget/dt/MADE.UI.Controls.ChipBox.svg)](https://www.nuget.org/packages/MADE.UI.Controls.ChipBox) | | UI.Controls.DropDownList | [![NuGet](https://img.shields.io/nuget/v/MADE.UI.Controls.DropDownList)](https://www.nuget.org/packages/MADE.UI.Controls.DropDownList/) | [![NuGet](https://img.shields.io/nuget/vpre/MADE.UI.Controls.DropDownList)](https://www.nuget.org/packages/MADE.UI.Controls.DropDownList/) | [![NuGet Downloads](https://img.shields.io/nuget/dt/MADE.UI.Controls.DropDownList.svg)](https://www.nuget.org/packages/MADE.UI.Controls.DropDownList) | diff --git a/docs/articles/features/media-image.md b/docs/articles/features/media-image.md new file mode 100644 index 0000000..dcdf665 --- /dev/null +++ b/docs/articles/features/media-image.md @@ -0,0 +1,43 @@ +--- +uid: package-media-image +title: Using the Media Image package +--- + +# Using the Media Image package + +The Media Image package is designed to be used in applications that require image processing. + +## Loading StorageFile thumbnails into an Image with LoadStorageFileThumbnailImageBehavior + +The `MADE.Media.Image.Behaviors.LoadStorageFileThumbnailImageBehavior` is a custom behavior built on the [Microsoft XAML behaviors SDK](https://github.com/Microsoft/XamlBehaviors). + +It can be attached to an `Image` UI element and used to load the thumbnail of a `StorageFile`. + +You can do this in your app XAML as shown below. + +```xml + + + + + + + + + + + +``` + +This could result in a generated UI that looks like this. + +Result of using LoadStorageFileThumbnailImageBehavior diff --git a/docs/articles/intro.md b/docs/articles/intro.md index 708b2e8..427cafc 100644 --- a/docs/articles/intro.md +++ b/docs/articles/intro.md @@ -19,6 +19,7 @@ dotnet add package MADE.UI | Package | Version | | --- | --- | +| MADE.Media.Image | [![NuGet](https://img.shields.io/nuget/v/MADE.Media.Image)](https://www.nuget.org/packages/MADE.Media.Image/) | | MADE.UI | [![NuGet](https://img.shields.io/nuget/v/MADE.UI)](https://www.nuget.org/packages/MADE.UI/) | | MADE.UI.Controls.ChipBox | [![NuGet](https://img.shields.io/nuget/v/MADE.UI.Controls.ChipBox)](https://www.nuget.org/packages/MADE.UI.Controls.ChipBox/) | | MADE.UI.Controls.DropDownList | [![NuGet](https://img.shields.io/nuget/v/MADE.UI.Controls.DropDownList)](https://www.nuget.org/packages/MADE.UI.Controls.DropDownList/) | @@ -29,6 +30,20 @@ dotnet add package MADE.UI | MADE.UI.Styling | [![NuGet](https://img.shields.io/nuget/v/MADE.UI.Styling)](https://www.nuget.org/packages/MADE.UI.Styling/) | | MADE.UI.ViewManagement | [![NuGet](https://img.shields.io/nuget/v/MADE.UI.ViewManagement)](https://www.nuget.org/packages/MADE.UI.ViewManagement/) | +#### Media.Image + +The Media Image package is designed to be used in applications that require image processing. + +It provides capabilities, such as: + +- LoadStorageFileThumbnailImageBehavior, a XAML behavior for loading a thumbnail from a `StorageFile` on an `Image` element. + + + +[Discover Media.Image](features/media-image.md) + + + #### UI The UI package is a base library for building out great user experiences for applications built for Windows, Android, iOS, and the web. diff --git a/samples/MADE.Samples/MADE.Samples.Droid/MADE.Samples.Droid.csproj b/samples/MADE.Samples/MADE.Samples.Droid/MADE.Samples.Droid.csproj index b352abd..5ed82f6 100644 --- a/samples/MADE.Samples/MADE.Samples.Droid/MADE.Samples.Droid.csproj +++ b/samples/MADE.Samples/MADE.Samples.Droid/MADE.Samples.Droid.csproj @@ -122,6 +122,10 @@ + + {16e2f926-ddd8-4fbc-85dc-23acbfcd483c} + MADE.Media.Image + {d1a16208-5a34-4cc1-b175-01b5ac99e69e} MADE.UI.Controls.ChipBox diff --git a/samples/MADE.Samples/MADE.Samples.UWP/MADE.Samples.UWP.csproj b/samples/MADE.Samples/MADE.Samples.UWP/MADE.Samples.UWP.csproj index 50c1e70..6e8c620 100644 --- a/samples/MADE.Samples/MADE.Samples.UWP/MADE.Samples.UWP.csproj +++ b/samples/MADE.Samples/MADE.Samples.UWP/MADE.Samples.UWP.csproj @@ -164,6 +164,10 @@ + + {16e2f926-ddd8-4fbc-85dc-23acbfcd483c} + MADE.Media.Image + {d1a16208-5a34-4cc1-b175-01b5ac99e69e} MADE.UI.Controls.ChipBox diff --git a/samples/MADE.Samples/MADE.Samples.Wasm/MADE.Samples.Wasm.csproj b/samples/MADE.Samples/MADE.Samples.Wasm/MADE.Samples.Wasm.csproj index 534d297..c9e1c5b 100644 --- a/samples/MADE.Samples/MADE.Samples.Wasm/MADE.Samples.Wasm.csproj +++ b/samples/MADE.Samples/MADE.Samples.Wasm/MADE.Samples.Wasm.csproj @@ -65,6 +65,7 @@ + diff --git a/samples/MADE.Samples/MADE.Samples.iOS/MADE.Samples.iOS.csproj b/samples/MADE.Samples/MADE.Samples.iOS/MADE.Samples.iOS.csproj index 3231da0..9ed176b 100644 --- a/samples/MADE.Samples/MADE.Samples.iOS/MADE.Samples.iOS.csproj +++ b/samples/MADE.Samples/MADE.Samples.iOS/MADE.Samples.iOS.csproj @@ -187,6 +187,10 @@ + + {16e2f926-ddd8-4fbc-85dc-23acbfcd483c} + MADE.Media.Image + {d1a16208-5a34-4cc1-b175-01b5ac99e69e} MADE.UI.Controls.ChipBox diff --git a/src/MADE.Media.Image/Behaviors/LoadStorageFileThumbnailImageBehavior.cs b/src/MADE.Media.Image/Behaviors/LoadStorageFileThumbnailImageBehavior.cs new file mode 100644 index 0000000..5070510 --- /dev/null +++ b/src/MADE.Media.Image/Behaviors/LoadStorageFileThumbnailImageBehavior.cs @@ -0,0 +1,69 @@ +// MADE Apps licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace MADE.Media.Image.Behaviors +{ + using System; + using System.Threading.Tasks; + using Microsoft.Xaml.Interactivity; + using Windows.Storage; + using Windows.Storage.FileProperties; + using Windows.UI.Xaml; + using Windows.UI.Xaml.Controls; + using Windows.UI.Xaml.Media.Imaging; + + /// + /// Defines a behavior for loading a storage file's thumbnail image into a control. + /// + public class LoadStorageFileThumbnailImageBehavior : Behavior + { + /// + /// Identifies the dependency property. + /// + public static readonly DependencyProperty FileProperty = DependencyProperty.Register( + nameof(File), + typeof(StorageFile), + typeof(LoadStorageFileThumbnailImageBehavior), + new PropertyMetadata( + null, + async (d, e) => + await ((LoadStorageFileThumbnailImageBehavior)d).UpdateImageSourceAsync((StorageFile)e.NewValue))); + + /// + /// Gets or sets the storage file to retrieve a thumbnail for. + /// + public StorageFile File + { + get => (StorageFile)this.GetValue(FileProperty); + set => this.SetValue(FileProperty, value); + } + + private async Task UpdateImageSourceAsync(IStorageItemProperties file) + { + if (file == null) + { + return; + } + +#if WINDOWS_UWP + StorageItemThumbnail thumbnail = await file.GetThumbnailAsync( + ThumbnailMode.SingleItem, + 256, + ThumbnailOptions.ResizeThumbnail); + + if (thumbnail == null) + { + return; + } + + if (this.AssociatedObject != null) + { + var bitmapImage = new BitmapImage(); + bitmapImage.SetSource(thumbnail.CloneStream()); + + this.AssociatedObject.Source = bitmapImage; + } +#endif + } + } +} \ No newline at end of file diff --git a/src/MADE.Media.Image/MADE.Media.Image.csproj b/src/MADE.Media.Image/MADE.Media.Image.csproj new file mode 100644 index 0000000..a330706 --- /dev/null +++ b/src/MADE.Media.Image/MADE.Media.Image.csproj @@ -0,0 +1,32 @@ + + + + uap10.0.19041;MonoAndroid11.0;xamarinios10;netstandard2.0;xamarinmac20 + true + MADE.NET Images + + This package includes: + - LoadStorageFileThumbnailImageBehavior for providing the ability to show a thumbnail for a storage file on an Image. + + MADE Media Images Thumbnail StorageFile + true + + + + + + + + + + + + + + Designer + MSBuild:Compile + PreserveNewest + + + + \ No newline at end of file