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 | [](https://www.nuget.org/packages/MADE.Media.Image/) | [](https://www.nuget.org/packages/MADE.Media.Image/) | [](https://www.nuget.org/packages/MADE.Media.Image) |
| UI | [](https://www.nuget.org/packages/MADE.UI/) | [](https://www.nuget.org/packages/MADE.UI/) | [](https://www.nuget.org/packages/MADE.UI) |
| UI.Controls.ChipBox | [](https://www.nuget.org/packages/MADE.UI.Controls.ChipBox/) | [](https://www.nuget.org/packages/MADE.UI.Controls.ChipBox/) | [](https://www.nuget.org/packages/MADE.UI.Controls.ChipBox) |
| UI.Controls.DropDownList | [](https://www.nuget.org/packages/MADE.UI.Controls.DropDownList/) | [](https://www.nuget.org/packages/MADE.UI.Controls.DropDownList/) | [](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.
+
+
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 | [](https://www.nuget.org/packages/MADE.Media.Image/) |
| MADE.UI | [](https://www.nuget.org/packages/MADE.UI/) |
| MADE.UI.Controls.ChipBox | [](https://www.nuget.org/packages/MADE.UI.Controls.ChipBox/) |
| 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 | [](https://www.nuget.org/packages/MADE.UI.Styling/) |
| 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