diff --git a/FormsGallery/FormsGallery/FormsGallery.Android/FormsGallery.Android.csproj b/FormsGallery/FormsGallery/FormsGallery.Android/FormsGallery.Android.csproj
index f10a6fb8ab..f3db5b24bd 100644
--- a/FormsGallery/FormsGallery/FormsGallery.Android/FormsGallery.Android.csproj
+++ b/FormsGallery/FormsGallery/FormsGallery.Android/FormsGallery.Android.csproj
@@ -45,10 +45,10 @@
- 4.7.0.968
+ 4.8.0.1269
- 4.7.0.968
+ 4.8.0.1269
diff --git a/FormsGallery/FormsGallery/FormsGallery.UWP/FormsGallery.UWP.csproj b/FormsGallery/FormsGallery/FormsGallery.UWP/FormsGallery.UWP.csproj
index a8d887413b..931f50e8e2 100644
--- a/FormsGallery/FormsGallery/FormsGallery.UWP/FormsGallery.UWP.csproj
+++ b/FormsGallery/FormsGallery/FormsGallery.UWP/FormsGallery.UWP.csproj
@@ -90,8 +90,8 @@
-
-
+
+
diff --git a/FormsGallery/FormsGallery/FormsGallery.iOS/FormsGallery.iOS.csproj b/FormsGallery/FormsGallery/FormsGallery.iOS/FormsGallery.iOS.csproj
index 9912d81a25..93fa1f8229 100644
--- a/FormsGallery/FormsGallery/FormsGallery.iOS/FormsGallery.iOS.csproj
+++ b/FormsGallery/FormsGallery/FormsGallery.iOS/FormsGallery.iOS.csproj
@@ -144,10 +144,10 @@
- 4.7.0.968
+ 4.8.0.1269
- 4.7.0.968
+ 4.8.0.1269
diff --git a/FormsGallery/FormsGallery/FormsGallery/FormsGallery.csproj b/FormsGallery/FormsGallery/FormsGallery/FormsGallery.csproj
index 2b2e3b6263..b7623e22ae 100644
--- a/FormsGallery/FormsGallery/FormsGallery/FormsGallery.csproj
+++ b/FormsGallery/FormsGallery/FormsGallery/FormsGallery.csproj
@@ -144,7 +144,7 @@
-
-
+
+
diff --git a/FormsGallery/FormsGallery/FormsGallery/XamlExamples/CollectionViewDemoPage.xaml b/FormsGallery/FormsGallery/FormsGallery/XamlExamples/CollectionViewDemoPage.xaml
index 3ac81496fa..3af026acc4 100644
--- a/FormsGallery/FormsGallery/FormsGallery/XamlExamples/CollectionViewDemoPage.xaml
+++ b/FormsGallery/FormsGallery/FormsGallery/XamlExamples/CollectionViewDemoPage.xaml
@@ -9,11 +9,8 @@
FontAttributes="Bold"
HorizontalOptions="Center" />
-
-
-
-
+
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Assets/AboutAssets.txt b/UserInterface/BrushDemos/BrushesDemos.Android/Assets/AboutAssets.txt
new file mode 100644
index 0000000000..072563f8f8
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.Android/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with your package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/BrushesDemos.Android.csproj b/UserInterface/BrushDemos/BrushesDemos.Android/BrushesDemos.Android.csproj
new file mode 100644
index 0000000000..bc2a537ec8
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.Android/BrushesDemos.Android.csproj
@@ -0,0 +1,96 @@
+
+
+
+ Debug
+ AnyCPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {c9e5eea5-ca05-42a1-839b-61506e0a37df}
+ Library
+ BrushesDemos.Droid
+ BrushesDemos.Android
+ True
+ True
+ Resources\Resource.designer.cs
+ Resource
+ Properties\AndroidManifest.xml
+ Resources
+ Assets
+ v9.0
+ true
+ true
+ Xamarin.Android.Net.AndroidClientHandler
+
+
+
+
+ true
+ portable
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ None
+
+
+ true
+ portable
+ true
+ bin\Release
+ prompt
+ 4
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}
+ BrushesDemos
+
+
+
+
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/MainActivity.cs b/UserInterface/BrushDemos/BrushesDemos.Android/MainActivity.cs
new file mode 100644
index 0000000000..c76423ee62
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.Android/MainActivity.cs
@@ -0,0 +1,20 @@
+using Android.App;
+using Android.Content.PM;
+using Android.OS;
+
+namespace BrushesDemos.Droid
+{
+ [Activity(Label = "BrushesDemos", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
+ public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
+ {
+ protected override void OnCreate(Bundle savedInstanceState)
+ {
+ TabLayoutResource = Resource.Layout.Tabbar;
+ ToolbarResource = Resource.Layout.Toolbar;
+
+ base.OnCreate(savedInstanceState);
+ global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
+ LoadApplication(new App());
+ }
+ }
+}
\ No newline at end of file
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Properties/AndroidManifest.xml b/UserInterface/BrushDemos/BrushesDemos.Android/Properties/AndroidManifest.xml
new file mode 100644
index 0000000000..b76bb622e1
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.Android/Properties/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Properties/AssemblyInfo.cs b/UserInterface/BrushDemos/BrushesDemos.Android/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000..364852eb1d
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.Android/Properties/AssemblyInfo.cs
@@ -0,0 +1,30 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using Android.App;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("BrushesDemos.Android")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("BrushesDemos.Android")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: ComVisible(false)]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+
+// Add some common permissions, these can be removed if not needed
+[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
+[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Resources/AboutResources.txt b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/AboutResources.txt
new file mode 100644
index 0000000000..cb30f20b1c
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/AboutResources.txt
@@ -0,0 +1,50 @@
+Images, layout descriptions, binary blobs and string dictionaries can be included
+in your application as resource files. Various Android APIs are designed to
+operate on the resource IDs instead of dealing with images, strings or binary blobs
+directly.
+
+For example, a sample Android app that contains a user interface layout (main.xml),
+an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png)
+would keep its resources in the "Resources" directory of the application:
+
+Resources/
+ drawable-hdpi/
+ icon.png
+
+ drawable-ldpi/
+ icon.png
+
+ drawable-mdpi/
+ icon.png
+
+ layout/
+ main.xml
+
+ values/
+ strings.xml
+
+In order to get the build system to recognize Android resources, set the build action to
+"AndroidResource". The native Android APIs do not operate directly with filenames, but
+instead operate on resource IDs. When you compile an Android application that uses resources,
+the build system will package the resources for distribution and generate a class called
+"Resource" that contains the tokens for each one of the resources included. For example,
+for the above Resources layout, this is what the Resource class would expose:
+
+public class Resource {
+ public class drawable {
+ public const int icon = 0x123;
+ }
+
+ public class layout {
+ public const int main = 0x456;
+ }
+
+ public class strings {
+ public const int first_string = 0xabc;
+ public const int second_string = 0xbcd;
+ }
+}
+
+You would then use R.drawable.icon to reference the drawable/icon.png file, or Resource.layout.main
+to reference the layout/main.xml file, or Resource.strings.first_string to reference the first
+string in the dictionary file values/strings.xml.
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Resources/layout/Tabbar.xml b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/layout/Tabbar.xml
new file mode 100644
index 0000000000..b2d0868812
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/layout/Tabbar.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Resources/layout/Toolbar.xml b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/layout/Toolbar.xml
new file mode 100644
index 0000000000..32440653b8
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/layout/Toolbar.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-anydpi-v26/icon.xml b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-anydpi-v26/icon.xml
new file mode 100644
index 0000000000..88d1d0a16c
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-anydpi-v26/icon.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-anydpi-v26/icon_round.xml b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-anydpi-v26/icon_round.xml
new file mode 100644
index 0000000000..88d1d0a16c
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-anydpi-v26/icon_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-hdpi/icon.png b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-hdpi/icon.png
new file mode 100644
index 0000000000..4623ca2c42
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-hdpi/icon.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-hdpi/launcher_foreground.png b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-hdpi/launcher_foreground.png
new file mode 100644
index 0000000000..a89e5bbce6
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-hdpi/launcher_foreground.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-mdpi/icon.png b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-mdpi/icon.png
new file mode 100644
index 0000000000..9b1d25e25d
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-mdpi/icon.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-mdpi/launcher_foreground.png b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-mdpi/launcher_foreground.png
new file mode 100644
index 0000000000..431a8a053d
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-mdpi/launcher_foreground.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xhdpi/icon.png b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xhdpi/icon.png
new file mode 100644
index 0000000000..844dfe544e
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xhdpi/icon.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xhdpi/launcher_foreground.png b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xhdpi/launcher_foreground.png
new file mode 100644
index 0000000000..9e9e4f8e4c
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xhdpi/launcher_foreground.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xxhdpi/icon.png b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xxhdpi/icon.png
new file mode 100644
index 0000000000..e20ec9ae22
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xxhdpi/icon.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xxhdpi/launcher_foreground.png b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xxhdpi/launcher_foreground.png
new file mode 100644
index 0000000000..5f1e1356eb
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xxhdpi/launcher_foreground.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xxxhdpi/icon.png b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xxxhdpi/icon.png
new file mode 100644
index 0000000000..8a08bf75e7
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xxxhdpi/icon.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png
new file mode 100644
index 0000000000..aca9f8d1c0
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Resources/values/colors.xml b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/values/colors.xml
new file mode 100644
index 0000000000..bdd44a8371
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/values/colors.xml
@@ -0,0 +1,7 @@
+
+
+ #FFFFFF
+ #3F51B5
+ #303F9F
+ #FF4081
+
\ No newline at end of file
diff --git a/UserInterface/BrushDemos/BrushesDemos.Android/Resources/values/styles.xml b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/values/styles.xml
new file mode 100644
index 0000000000..088e4497fa
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.Android/Resources/values/styles.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UserInterface/BrushDemos/BrushesDemos.UWP/App.xaml b/UserInterface/BrushDemos/BrushesDemos.UWP/App.xaml
new file mode 100644
index 0000000000..bbc878e7cf
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.UWP/App.xaml
@@ -0,0 +1,7 @@
+
+
+
diff --git a/UserInterface/BrushDemos/BrushesDemos.UWP/App.xaml.cs b/UserInterface/BrushDemos/BrushesDemos.UWP/App.xaml.cs
new file mode 100644
index 0000000000..20aa256994
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.UWP/App.xaml.cs
@@ -0,0 +1,92 @@
+using System;
+using Windows.ApplicationModel;
+using Windows.ApplicationModel.Activation;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Navigation;
+
+namespace BrushesDemos.UWP
+{
+ ///
+ /// Provides application-specific behavior to supplement the default Application class.
+ ///
+ sealed partial class App : Application
+ {
+ ///
+ /// Initializes the singleton application object. This is the first line of authored code
+ /// executed, and as such is the logical equivalent of main() or WinMain().
+ ///
+ public App()
+ {
+ this.InitializeComponent();
+ this.Suspending += OnSuspending;
+ }
+
+ ///
+ /// Invoked when the application is launched normally by the end user. Other entry points
+ /// will be used such as when the application is launched to open a specific file.
+ ///
+ /// Details about the launch request and process.
+ protected override void OnLaunched(LaunchActivatedEventArgs e)
+ {
+ Frame rootFrame = Window.Current.Content as Frame;
+
+ // Do not repeat app initialization when the Window already has content,
+ // just ensure that the window is active
+ if (rootFrame == null)
+ {
+ // Create a Frame to act as the navigation context and navigate to the first page
+ rootFrame = new Frame();
+
+ rootFrame.NavigationFailed += OnNavigationFailed;
+
+ Xamarin.Forms.Forms.Init(e);
+
+ if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
+ {
+ //TODO: Load state from previously suspended application
+ }
+
+ // Place the frame in the current Window
+ Window.Current.Content = rootFrame;
+ }
+
+ if (e.PrelaunchActivated == false)
+ {
+ if (rootFrame.Content == null)
+ {
+ // When the navigation stack isn't restored navigate to the first page,
+ // configuring the new page by passing required information as a navigation
+ // parameter
+ rootFrame.Navigate(typeof(MainPage), e.Arguments);
+ }
+ // Ensure the current window is active
+ Window.Current.Activate();
+ }
+ }
+
+ ///
+ /// Invoked when Navigation to a certain page fails
+ ///
+ /// The Frame which failed navigation
+ /// Details about the navigation failure
+ void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
+ {
+ throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
+ }
+
+ ///
+ /// Invoked when application execution is being suspended. Application state is saved
+ /// without knowing whether the application will be terminated or resumed with the contents
+ /// of memory still intact.
+ ///
+ /// The source of the suspend request.
+ /// Details about the suspend request.
+ private void OnSuspending(object sender, SuspendingEventArgs e)
+ {
+ var deferral = e.SuspendingOperation.GetDeferral();
+ //TODO: Save application state and stop any background activity
+ deferral.Complete();
+ }
+ }
+}
diff --git a/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/LockScreenLogo.scale-200.png b/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/LockScreenLogo.scale-200.png
new file mode 100644
index 0000000000..735f57adb5
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/LockScreenLogo.scale-200.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/SplashScreen.scale-200.png b/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/SplashScreen.scale-200.png
new file mode 100644
index 0000000000..023e7f1fed
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/SplashScreen.scale-200.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/Square150x150Logo.scale-200.png b/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/Square150x150Logo.scale-200.png
new file mode 100644
index 0000000000..af49fec1a5
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/Square150x150Logo.scale-200.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/Square44x44Logo.scale-200.png b/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/Square44x44Logo.scale-200.png
new file mode 100644
index 0000000000..ce342a2ec8
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/Square44x44Logo.scale-200.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png
new file mode 100644
index 0000000000..f6c02ce97e
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/StoreLogo.png b/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/StoreLogo.png
new file mode 100644
index 0000000000..7385b56c0e
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/StoreLogo.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/Wide310x150Logo.scale-200.png b/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/Wide310x150Logo.scale-200.png
new file mode 100644
index 0000000000..288995b397
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.UWP/Assets/Wide310x150Logo.scale-200.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.UWP/BrushesDemos.UWP.csproj b/UserInterface/BrushDemos/BrushesDemos.UWP/BrushesDemos.UWP.csproj
new file mode 100644
index 0000000000..0c6e10a173
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.UWP/BrushesDemos.UWP.csproj
@@ -0,0 +1,177 @@
+
+
+
+
+ Debug
+ x86
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}
+ AppContainerExe
+ Properties
+ BrushesDemos.UWP
+ BrushesDemos.UWP
+ en-US
+ UAP
+ 10.0.18362.0
+ 10.0.16299.0
+ 14
+ 512
+ {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ true
+ false
+
+
+ true
+ bin\x86\Debug\
+ DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
+ ;2008
+ full
+ x86
+ false
+ prompt
+ true
+
+
+ bin\x86\Release\
+ TRACE;NETFX_CORE;WINDOWS_UWP
+ true
+ ;2008
+ pdbonly
+ x86
+ false
+ prompt
+ true
+ true
+
+
+ true
+ bin\ARM\Debug\
+ DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
+ ;2008
+ full
+ ARM
+ false
+ prompt
+ true
+
+
+ bin\ARM\Release\
+ TRACE;NETFX_CORE;WINDOWS_UWP
+ true
+ ;2008
+ pdbonly
+ ARM
+ false
+ prompt
+ true
+ true
+
+
+ true
+ bin\ARM64\Debug\
+ DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
+ ;2008
+ full
+ ARM64
+ false
+ prompt
+ true
+ true
+
+
+ bin\ARM64\Release\
+ TRACE;NETFX_CORE;WINDOWS_UWP
+ true
+ ;2008
+ pdbonly
+ ARM64
+ false
+ prompt
+ true
+ true
+
+
+ true
+ bin\x64\Debug\
+ DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
+ ;2008
+ full
+ x64
+ false
+ prompt
+ true
+
+
+ bin\x64\Release\
+ TRACE;NETFX_CORE;WINDOWS_UWP
+ true
+ ;2008
+ pdbonly
+ x64
+ false
+ prompt
+ true
+ true
+
+
+ PackageReference
+
+
+
+ App.xaml
+
+
+ MainPage.xaml
+
+
+
+
+
+ Designer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MSBuild:Compile
+ Designer
+
+
+ MSBuild:Compile
+ Designer
+
+
+
+
+ 6.2.10
+
+
+ 4.8.0.1269
+
+
+
+
+ {e360def0-8933-4b8f-9a4e-301a23125604}
+ BrushesDemos
+
+
+
+ 14.0
+
+
+
+
diff --git a/UserInterface/BrushDemos/BrushesDemos.UWP/MainPage.xaml b/UserInterface/BrushDemos/BrushesDemos.UWP/MainPage.xaml
new file mode 100644
index 0000000000..e0f6bc38b8
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.UWP/MainPage.xaml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
diff --git a/UserInterface/BrushDemos/BrushesDemos.UWP/MainPage.xaml.cs b/UserInterface/BrushDemos/BrushesDemos.UWP/MainPage.xaml.cs
new file mode 100644
index 0000000000..9bf0229526
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.UWP/MainPage.xaml.cs
@@ -0,0 +1,11 @@
+namespace BrushesDemos.UWP
+{
+ public sealed partial class MainPage
+ {
+ public MainPage()
+ {
+ this.InitializeComponent();
+ this.LoadApplication(new BrushesDemos.App());
+ }
+ }
+}
diff --git a/UserInterface/BrushDemos/BrushesDemos.UWP/Package.appxmanifest b/UserInterface/BrushDemos/BrushesDemos.UWP/Package.appxmanifest
new file mode 100644
index 0000000000..1297906e38
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.UWP/Package.appxmanifest
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+ BrushesDemos.UWP
+ Dave
+ Assets\StoreLogo.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UserInterface/BrushDemos/BrushesDemos.UWP/Properties/AssemblyInfo.cs b/UserInterface/BrushDemos/BrushesDemos.UWP/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000..0a52b87d8c
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.UWP/Properties/AssemblyInfo.cs
@@ -0,0 +1,29 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("BrushesDemos.UWP")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("BrushesDemos.UWP")]
+[assembly: AssemblyCopyright("Copyright © 2020")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: ComVisible(false)]
\ No newline at end of file
diff --git a/UserInterface/BrushDemos/BrushesDemos.UWP/Properties/Default.rd.xml b/UserInterface/BrushDemos/BrushesDemos.UWP/Properties/Default.rd.xml
new file mode 100644
index 0000000000..af00722cdf
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.UWP/Properties/Default.rd.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/AppDelegate.cs b/UserInterface/BrushDemos/BrushesDemos.iOS/AppDelegate.cs
new file mode 100644
index 0000000000..22f46f1d18
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.iOS/AppDelegate.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Foundation;
+using UIKit;
+
+namespace BrushesDemos.iOS
+{
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to
+ // application events from iOS.
+ [Register("AppDelegate")]
+ public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
+ {
+ //
+ // This method is invoked when the application has loaded and is ready to run. In this
+ // method you should instantiate the window, load the UI into it and then make the window
+ // visible.
+ //
+ // You have 17 seconds to return from this method, or iOS will terminate your application.
+ //
+ public override bool FinishedLaunching(UIApplication app, NSDictionary options)
+ {
+ global::Xamarin.Forms.Forms.Init();
+ LoadApplication(new App());
+
+ return base.FinishedLaunching(app, options);
+ }
+ }
+}
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000000..98f4d035c8
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,117 @@
+{
+ "images": [
+ {
+ "scale": "2x",
+ "size": "20x20",
+ "idiom": "iphone",
+ "filename": "Icon40.png"
+ },
+ {
+ "scale": "3x",
+ "size": "20x20",
+ "idiom": "iphone",
+ "filename": "Icon60.png"
+ },
+ {
+ "scale": "2x",
+ "size": "29x29",
+ "idiom": "iphone",
+ "filename": "Icon58.png"
+ },
+ {
+ "scale": "3x",
+ "size": "29x29",
+ "idiom": "iphone",
+ "filename": "Icon87.png"
+ },
+ {
+ "scale": "2x",
+ "size": "40x40",
+ "idiom": "iphone",
+ "filename": "Icon80.png"
+ },
+ {
+ "scale": "3x",
+ "size": "40x40",
+ "idiom": "iphone",
+ "filename": "Icon120.png"
+ },
+ {
+ "scale": "2x",
+ "size": "60x60",
+ "idiom": "iphone",
+ "filename": "Icon120.png"
+ },
+ {
+ "scale": "3x",
+ "size": "60x60",
+ "idiom": "iphone",
+ "filename": "Icon180.png"
+ },
+ {
+ "scale": "1x",
+ "size": "20x20",
+ "idiom": "ipad",
+ "filename": "Icon20.png"
+ },
+ {
+ "scale": "2x",
+ "size": "20x20",
+ "idiom": "ipad",
+ "filename": "Icon40.png"
+ },
+ {
+ "scale": "1x",
+ "size": "29x29",
+ "idiom": "ipad",
+ "filename": "Icon29.png"
+ },
+ {
+ "scale": "2x",
+ "size": "29x29",
+ "idiom": "ipad",
+ "filename": "Icon58.png"
+ },
+ {
+ "scale": "1x",
+ "size": "40x40",
+ "idiom": "ipad",
+ "filename": "Icon40.png"
+ },
+ {
+ "scale": "2x",
+ "size": "40x40",
+ "idiom": "ipad",
+ "filename": "Icon80.png"
+ },
+ {
+ "scale": "1x",
+ "size": "76x76",
+ "idiom": "ipad",
+ "filename": "Icon76.png"
+ },
+ {
+ "scale": "2x",
+ "size": "76x76",
+ "idiom": "ipad",
+ "filename": "Icon152.png"
+ },
+ {
+ "scale": "2x",
+ "size": "83.5x83.5",
+ "idiom": "ipad",
+ "filename": "Icon167.png"
+ },
+ {
+ "scale": "1x",
+ "size": "1024x1024",
+ "idiom": "ios-marketing",
+ "filename": "Icon1024.png"
+ }
+ ],
+ "properties": {},
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png
new file mode 100644
index 0000000000..9174c989a9
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png
new file mode 100644
index 0000000000..9c60a1761d
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png
new file mode 100644
index 0000000000..448d6efb57
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png
new file mode 100644
index 0000000000..8524768f8d
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png
new file mode 100644
index 0000000000..60a64703c0
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png
new file mode 100644
index 0000000000..45268a641c
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png
new file mode 100644
index 0000000000..6a6c77a8b4
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png
new file mode 100644
index 0000000000..cc7edcf5cb
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png
new file mode 100644
index 0000000000..1ad04f004b
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png
new file mode 100644
index 0000000000..2dd52620a8
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png
new file mode 100644
index 0000000000..b058cae2f4
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png
new file mode 100644
index 0000000000..02e47a2611
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png
new file mode 100644
index 0000000000..4954a4bd33
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/BrushesDemos.iOS.csproj b/UserInterface/BrushDemos/BrushesDemos.iOS/BrushesDemos.iOS.csproj
new file mode 100644
index 0000000000..62a56d7c9d
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.iOS/BrushesDemos.iOS.csproj
@@ -0,0 +1,135 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ 8.0.30703
+ 2.0
+ {45912288-4CEA-4F73-8866-1E412C8427A5}
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {6143fdea-f3c2-4a09-aafa-6e230626515e}
+ Exe
+ BrushesDemos.iOS
+ Resources
+ BrushesDemos.iOS
+ true
+ NSUrlSessionHandler
+ automatic
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG
+ prompt
+ 4
+ x86_64
+ None
+ true
+
+
+ none
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ None
+ x86_64
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG
+ prompt
+ 4
+ ARM64
+ iPhone Developer
+ true
+ Entitlements.plist
+ None
+ -all
+
+
+ none
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ ARM64
+ iPhone Developer
+ Entitlements.plist
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}
+ BrushesDemos
+
+
+
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Entitlements.plist b/UserInterface/BrushDemos/BrushesDemos.iOS/Entitlements.plist
new file mode 100644
index 0000000000..e9a3005f78
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.iOS/Entitlements.plist
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Info.plist b/UserInterface/BrushDemos/BrushesDemos.iOS/Info.plist
new file mode 100644
index 0000000000..6fef77272a
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.iOS/Info.plist
@@ -0,0 +1,38 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ MinimumOSVersion
+ 8.0
+ CFBundleDisplayName
+ BrushesDemos
+ CFBundleIdentifier
+ com.companyname.BrushesDemos
+ CFBundleVersion
+ 1.0
+ UILaunchStoryboardName
+ LaunchScreen
+ CFBundleName
+ BrushesDemos
+ XSAppIconAssets
+ Assets.xcassets/AppIcon.appiconset
+
+
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Main.cs b/UserInterface/BrushDemos/BrushesDemos.iOS/Main.cs
new file mode 100644
index 0000000000..2f208de708
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.iOS/Main.cs
@@ -0,0 +1,15 @@
+using UIKit;
+
+namespace BrushesDemos.iOS
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, "AppDelegate");
+ }
+ }
+}
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Properties/AssemblyInfo.cs b/UserInterface/BrushDemos/BrushesDemos.iOS/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000..1142a8371c
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.iOS/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("BrushesDemos.iOS")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("BrushesDemos.iOS")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("72bdc44f-c588-44f3-b6df-9aace7daafdd")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/Default-568h@2x.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/Default-568h@2x.png
new file mode 100644
index 0000000000..26c6461e50
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/Default-568h@2x.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/Default-Portrait.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/Default-Portrait.png
new file mode 100644
index 0000000000..5d0d1ab4c6
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/Default-Portrait.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/Default-Portrait@2x.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/Default-Portrait@2x.png
new file mode 100644
index 0000000000..0ee2688e8f
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/Default-Portrait@2x.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/Default.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/Default.png
new file mode 100644
index 0000000000..b74643c0aa
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/Default.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/Default@2x.png b/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/Default@2x.png
new file mode 100644
index 0000000000..dbd6bd3e86
Binary files /dev/null and b/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/Default@2x.png differ
diff --git a/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/LaunchScreen.storyboard b/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/LaunchScreen.storyboard
new file mode 100644
index 0000000000..f12b936801
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.iOS/Resources/LaunchScreen.storyboard
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UserInterface/BrushDemos/BrushesDemos.sln b/UserInterface/BrushDemos/BrushesDemos.sln
new file mode 100644
index 0000000000..2c053364fa
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos.sln
@@ -0,0 +1,152 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.30204.135
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BrushesDemos.Android", "BrushesDemos.Android\BrushesDemos.Android.csproj", "{28836F43-40E2-4E0D-97C2-806387F81907}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BrushesDemos.iOS", "BrushesDemos.iOS\BrushesDemos.iOS.csproj", "{45912288-4CEA-4F73-8866-1E412C8427A5}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BrushesDemos", "BrushesDemos\BrushesDemos.csproj", "{E360DEF0-8933-4B8F-9A4E-301A23125604}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BrushesDemos.UWP", "BrushesDemos.UWP\BrushesDemos.UWP.csproj", "{66DF233A-7FCB-4C92-BEC6-CE1394FDD512}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|ARM = Debug|ARM
+ Debug|ARM64 = Debug|ARM64
+ Debug|iPhone = Debug|iPhone
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|ARM = Release|ARM
+ Release|ARM64 = Release|ARM64
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|ARM.Build.0 = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|ARM.Deploy.0 = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|ARM64.Deploy.0 = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|x64.Build.0 = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|x64.Deploy.0 = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|x86.Build.0 = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Debug|x86.Deploy.0 = Debug|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|Any CPU.Build.0 = Release|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|ARM.ActiveCfg = Release|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|ARM.Build.0 = Release|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|ARM.Deploy.0 = Release|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|ARM64.Build.0 = Release|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|ARM64.Deploy.0 = Release|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|iPhone.Build.0 = Release|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|x64.ActiveCfg = Release|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|x64.Build.0 = Release|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|x64.Deploy.0 = Release|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|x86.ActiveCfg = Release|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|x86.Build.0 = Release|Any CPU
+ {28836F43-40E2-4E0D-97C2-806387F81907}.Release|x86.Deploy.0 = Release|Any CPU
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Debug|ARM.ActiveCfg = Debug|iPhone
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Debug|ARM64.ActiveCfg = Debug|iPhone
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Debug|iPhone.Build.0 = Debug|iPhone
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Debug|x64.ActiveCfg = Debug|iPhone
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Debug|x86.ActiveCfg = Debug|iPhone
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Release|Any CPU.Build.0 = Release|iPhoneSimulator
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Release|ARM.ActiveCfg = Release|iPhone
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Release|ARM64.ActiveCfg = Release|iPhone
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Release|iPhone.ActiveCfg = Release|iPhone
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Release|iPhone.Build.0 = Release|iPhone
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Release|x64.ActiveCfg = Release|iPhone
+ {45912288-4CEA-4F73-8866-1E412C8427A5}.Release|x86.ActiveCfg = Release|iPhone
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Debug|ARM.Build.0 = Debug|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Debug|x64.Build.0 = Debug|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Debug|x86.Build.0 = Debug|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Release|ARM.ActiveCfg = Release|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Release|ARM.Build.0 = Release|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Release|ARM64.Build.0 = Release|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Release|iPhone.Build.0 = Release|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Release|x64.ActiveCfg = Release|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Release|x64.Build.0 = Release|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Release|x86.ActiveCfg = Release|Any CPU
+ {E360DEF0-8933-4B8F-9A4E-301A23125604}.Release|x86.Build.0 = Release|Any CPU
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Debug|ARM.ActiveCfg = Debug|ARM
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Debug|ARM.Build.0 = Debug|ARM
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Debug|ARM.Deploy.0 = Debug|ARM
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Debug|ARM64.Build.0 = Debug|ARM64
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Debug|ARM64.Deploy.0 = Debug|ARM64
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Debug|iPhone.ActiveCfg = Debug|x86
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Debug|x64.ActiveCfg = Debug|x64
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Debug|x64.Build.0 = Debug|x64
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Debug|x64.Deploy.0 = Debug|x64
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Debug|x86.ActiveCfg = Debug|x86
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Debug|x86.Build.0 = Debug|x86
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Debug|x86.Deploy.0 = Debug|x86
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Release|Any CPU.ActiveCfg = Release|x86
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Release|ARM.ActiveCfg = Release|ARM
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Release|ARM.Build.0 = Release|ARM
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Release|ARM.Deploy.0 = Release|ARM
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Release|ARM64.ActiveCfg = Release|ARM64
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Release|ARM64.Build.0 = Release|ARM64
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Release|ARM64.Deploy.0 = Release|ARM64
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Release|iPhone.ActiveCfg = Release|x86
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Release|iPhoneSimulator.ActiveCfg = Release|x86
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Release|x64.ActiveCfg = Release|x64
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Release|x64.Build.0 = Release|x64
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Release|x64.Deploy.0 = Release|x64
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Release|x86.ActiveCfg = Release|x86
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Release|x86.Build.0 = Release|x86
+ {66DF233A-7FCB-4C92-BEC6-CE1394FDD512}.Release|x86.Deploy.0 = Release|x86
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {9404D68C-FDF9-46A0-B5F4-7DAA4C6D9104}
+ EndGlobalSection
+EndGlobal
diff --git a/UserInterface/BrushDemos/BrushesDemos/App.xaml b/UserInterface/BrushDemos/BrushesDemos/App.xaml
new file mode 100644
index 0000000000..47d7cb5c68
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/App.xaml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/UserInterface/BrushDemos/BrushesDemos/App.xaml.cs b/UserInterface/BrushDemos/BrushesDemos/App.xaml.cs
new file mode 100644
index 0000000000..baca1bf231
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/App.xaml.cs
@@ -0,0 +1,27 @@
+using Xamarin.Forms;
+
+namespace BrushesDemos
+{
+ public partial class App : Application
+ {
+ public App()
+ {
+ Device.SetFlags(new[] { "Brush_Experimental" });
+ InitializeComponent();
+
+ MainPage = new NavigationPage(new MainPage());
+ }
+
+ protected override void OnStart()
+ {
+ }
+
+ protected override void OnSleep()
+ {
+ }
+
+ protected override void OnResume()
+ {
+ }
+ }
+}
diff --git a/UserInterface/BrushDemos/BrushesDemos/AssemblyInfo.cs b/UserInterface/BrushDemos/BrushesDemos/AssemblyInfo.cs
new file mode 100644
index 0000000000..c859952e34
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/AssemblyInfo.cs
@@ -0,0 +1,3 @@
+using Xamarin.Forms.Xaml;
+
+[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
\ No newline at end of file
diff --git a/UserInterface/BrushDemos/BrushesDemos/Assets/Styles.css b/UserInterface/BrushDemos/BrushesDemos/Assets/Styles.css
new file mode 100644
index 0000000000..07ded2acc4
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Assets/Styles.css
@@ -0,0 +1,23 @@
+.linearGradientStyleWithCss90deg {
+ background: linear-gradient(90deg, rgb(255, 0, 0) 0%,rgb(255, 153, 51) 60%);
+}
+
+.linearGradientStyleWithCss180deg {
+ background: linear-gradient(180deg, rgb(255, 0, 0) 0%,rgb(255, 153, 51) 60%);
+}
+
+.linearGradientStyleWithCss270deg {
+ background: linear-gradient(270deg, rgb(255, 0, 0) 0%,rgb(255, 153, 51) 60%);
+}
+
+.radialGradientStyleWithCss {
+ background: radial-gradient(circle, rgb(255, 0, 0) 25%, rgb(0, 255, 0) 50%, rgb(0, 0, 255) 75%);
+}
+
+.radialGradientStyleWithCssLeft {
+ background: radial-gradient(circle at left, rgb(255, 0, 0) 25%, rgb(0, 255, 0) 50%, rgb(0, 0, 255) 75%);
+}
+
+.radialGradientStyleWithCssRight {
+ background: radial-gradient(circle at right, rgb(255, 0, 0) 25%, rgb(0, 255, 0) 50%, rgb(0, 0, 255) 75%);
+}
diff --git a/UserInterface/BrushDemos/BrushesDemos/BrushesDemos.csproj b/UserInterface/BrushDemos/BrushesDemos/BrushesDemos.csproj
new file mode 100644
index 0000000000..66fddfa2bc
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/BrushesDemos.csproj
@@ -0,0 +1,21 @@
+
+
+
+ netstandard2.0
+ true
+
+
+
+ portable
+ true
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UserInterface/BrushDemos/BrushesDemos/Controls/ColorSource.cs b/UserInterface/BrushDemos/BrushesDemos/Controls/ColorSource.cs
new file mode 100644
index 0000000000..d5c78d95c5
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Controls/ColorSource.cs
@@ -0,0 +1,35 @@
+using Xamarin.Forms;
+
+namespace BrushesDemos.Controls
+{
+ public class ColorSource : BindableObject
+ {
+ Color color;
+ bool isSelected;
+
+ public Color Color
+ {
+ get => color;
+ set
+ {
+ color = value;
+ OnPropertyChanged();
+ }
+ }
+
+ public bool IsSelected
+ {
+ get => isSelected;
+ set
+ {
+ isSelected = value;
+ OnPropertyChanged();
+ }
+ }
+
+ public ColorSource(Color color)
+ {
+ Color = color;
+ }
+ }
+}
diff --git a/UserInterface/BrushDemos/BrushesDemos/Controls/GradientColorPicker.xaml b/UserInterface/BrushDemos/BrushesDemos/Controls/GradientColorPicker.xaml
new file mode 100644
index 0000000000..a9f7efbb72
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Controls/GradientColorPicker.xaml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UserInterface/BrushDemos/BrushesDemos/Controls/GradientColorPicker.xaml.cs b/UserInterface/BrushDemos/BrushesDemos/Controls/GradientColorPicker.xaml.cs
new file mode 100644
index 0000000000..76a8cafa7b
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Controls/GradientColorPicker.xaml.cs
@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Xamarin.Forms;
+
+namespace BrushesDemos.Controls
+{
+ public partial class GradientColorPicker : ContentView
+ {
+ public event EventHandler ColorSelected;
+
+ public ColorSource SelectedColorSource { get; set; }
+
+ public GradientColorPicker()
+ {
+ InitializeComponent();
+
+ List colors = new List
+ {
+ "#ff0000", "#ff8000", "#ffbf00",
+ "#ffff00", "#80ff00", "#00ff40",
+ "#00ffff", "#00bfff", "#0080ff",
+ "#0000ff", "#4000ff", "#8000ff",
+ "#bf00ff", "#ff00ff", "#ff00bf",
+ "#ff0080", "#ff0040", "#ff0000"
+ };
+
+ BindableLayout.SetItemsSource(colorsLayout, colors.Select(c => new ColorSource(Color.FromHex(c))));
+ }
+
+ void InvokeColorSelected(ColorSource color)
+ {
+ ColorSelected?.Invoke(this, color);
+ }
+
+ void OnColorSourceTapped(object sender, EventArgs e)
+ {
+ if (!(sender is BindableObject bindable) || !(bindable.BindingContext is ColorSource selectedColorSource))
+ {
+ return;
+ }
+
+ if (SelectedColorSource == selectedColorSource)
+ {
+ return;
+ }
+
+ selectedColorSource.IsSelected = true;
+
+ if (SelectedColorSource != null)
+ {
+ SelectedColorSource.IsSelected = false;
+ }
+
+ SelectedColorSource = selectedColorSource;
+ }
+
+ void OnOKButtonClicked(object sender, EventArgs e) => Dismiss();
+
+ void OnCancelButtonClicked(object sender, EventArgs e) => Close();
+
+ void Close()
+ {
+ SelectedColorSource = null;
+ Dismiss();
+ }
+
+ void Dismiss()
+ {
+ InvokeColorSelected(SelectedColorSource);
+ }
+ }
+}
diff --git a/UserInterface/BrushDemos/BrushesDemos/SolidColorBrushColor.cs b/UserInterface/BrushDemos/BrushesDemos/SolidColorBrushColor.cs
new file mode 100644
index 0000000000..af6f138420
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/SolidColorBrushColor.cs
@@ -0,0 +1,57 @@
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Text;
+using Xamarin.Forms;
+
+namespace BrushesDemos
+{
+ public class SolidColorBrushColor : IEquatable, IComparable
+ {
+ public string Name { get; private set; }
+ public Color Color { get; private set; }
+ public string Hex { get; private set; }
+
+ public static IList All { get; private set; }
+
+ public bool Equals(SolidColorBrushColor other)
+ {
+ return Name.Equals(other.Name);
+ }
+
+ public int CompareTo(SolidColorBrushColor other)
+ {
+ return Name.CompareTo(other.Name);
+ }
+
+ static SolidColorBrushColor()
+ {
+ List all = new List();
+
+ // Loop through the public static fields of the Brush class
+ foreach (FieldInfo fieldInfo in typeof(Brush).GetRuntimeFields())
+ {
+ if (fieldInfo.IsPublic &&
+ fieldInfo.IsStatic &&
+ fieldInfo.FieldType == typeof(SolidColorBrush))
+ {
+ // Instantiate a SolidColorBrushColor object
+ SolidColorBrush brush = (SolidColorBrush)fieldInfo.GetValue(null);
+
+ SolidColorBrushColor brushColor = new SolidColorBrushColor
+ {
+ Name = fieldInfo.Name,
+ Color = brush.Color,
+ Hex = brush.Color.ToHex()
+ };
+
+ all.Add(brushColor);
+ }
+ }
+
+ all.TrimExcess();
+ all.Sort();
+ All = all;
+ }
+ }
+}
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/AllSolidColorBrushesDemoPage.xaml b/UserInterface/BrushDemos/BrushesDemos/Views/AllSolidColorBrushesDemoPage.xaml
new file mode 100644
index 0000000000..ab0cd57f6b
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/AllSolidColorBrushesDemoPage.xaml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/AllSolidColorBrushesDemoPage.xaml.cs b/UserInterface/BrushDemos/BrushesDemos/Views/AllSolidColorBrushesDemoPage.xaml.cs
new file mode 100644
index 0000000000..282d62358c
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/AllSolidColorBrushesDemoPage.xaml.cs
@@ -0,0 +1,12 @@
+using Xamarin.Forms;
+
+namespace BrushesDemos.Views
+{
+ public partial class AllSolidColorBrushesDemoPage : ContentPage
+ {
+ public AllSolidColorBrushesDemoPage()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/CSSDemoPage.xaml b/UserInterface/BrushDemos/BrushesDemos/Views/CSSDemoPage.xaml
new file mode 100644
index 0000000000..5aca738bb6
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/CSSDemoPage.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/CSSDemoPage.xaml.cs b/UserInterface/BrushDemos/BrushesDemos/Views/CSSDemoPage.xaml.cs
new file mode 100644
index 0000000000..5aa07da3e4
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/CSSDemoPage.xaml.cs
@@ -0,0 +1,12 @@
+using Xamarin.Forms;
+
+namespace BrushesDemos.Views
+{
+ public partial class CSSDemoPage : ContentPage
+ {
+ public CSSDemoPage()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/LinearGradientBrushDemoPage.xaml b/UserInterface/BrushDemos/BrushesDemos/Views/LinearGradientBrushDemoPage.xaml
new file mode 100644
index 0000000000..31d410eaec
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/LinearGradientBrushDemoPage.xaml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/LinearGradientBrushDemoPage.xaml.cs b/UserInterface/BrushDemos/BrushesDemos/Views/LinearGradientBrushDemoPage.xaml.cs
new file mode 100644
index 0000000000..19d4a8fb25
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/LinearGradientBrushDemoPage.xaml.cs
@@ -0,0 +1,12 @@
+using Xamarin.Forms;
+
+namespace BrushesDemos.Views
+{
+ public partial class LinearGradientBrushDemoPage : ContentPage
+ {
+ public LinearGradientBrushDemoPage()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/LinearGradientBrushExplorerPage.xaml b/UserInterface/BrushDemos/BrushesDemos/Views/LinearGradientBrushExplorerPage.xaml
new file mode 100644
index 0000000000..7e517d1c47
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/LinearGradientBrushExplorerPage.xaml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/LinearGradientBrushExplorerPage.xaml.cs b/UserInterface/BrushDemos/BrushesDemos/Views/LinearGradientBrushExplorerPage.xaml.cs
new file mode 100644
index 0000000000..aa7c5c9286
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/LinearGradientBrushExplorerPage.xaml.cs
@@ -0,0 +1,198 @@
+using System;
+using System.Linq;
+using BrushesDemos.Controls;
+using Xamarin.Forms;
+
+namespace BrushesDemos.Views
+{
+ public partial class LinearGradientBrushExplorerPage : ContentPage
+ {
+ const uint AnimationSpeed = 200;
+
+ GradientStopCollection gradientStops;
+ Point startPoint;
+ Point endPoint;
+ int offsets;
+ Layout layout;
+
+ public LinearGradientBrushExplorerPage()
+ {
+ InitializeComponent();
+ BindingContext = this;
+
+ gradientStops = new GradientStopCollection();
+ BindableLayout.SetItemsSource(gradientsStackLayout, gradientStops);
+ }
+
+ #region Overrides
+
+ protected override void OnAppearing()
+ {
+ base.OnAppearing();
+ gradientColorPicker.ColorSelected += OnGradientColorPickerColorSelected;
+ }
+
+ protected override void OnDisappearing()
+ {
+ base.OnDisappearing();
+ gradientColorPicker.ColorSelected -= OnGradientColorPickerColorSelected;
+ }
+
+ #endregion
+
+ #region Event handlers
+
+ void OnGradientColorPickerColorSelected(object sender, ColorSource e)
+ {
+ gradientColorPicker.FadeTo(0, 0, Easing.SinInOut);
+ gradientColorPicker.TranslateTo(0, 1000, 0, Easing.SinInOut);
+
+ ColorSource selectedColor = gradientColorPicker.SelectedColorSource;
+
+ if (selectedColor == null)
+ {
+ return;
+ }
+
+ if (!(layout.Children.FirstOrDefault() is Entry entry))
+ {
+ return;
+ }
+
+ int red = (int)(selectedColor.Color.R * 255);
+ int green = (int)(selectedColor.Color.G * 255);
+ int blue = (int)(selectedColor.Color.B * 255);
+
+ entry.Text = $"#{red:X2}{green:X2}{blue:X2}";
+ }
+
+ void OnColorPickerTapped(object sender, EventArgs e)
+ {
+ gradientColorPicker.FadeTo(1, AnimationSpeed, Easing.SinInOut);
+ gradientColorPicker.TranslateTo(0, 0, AnimationSpeed, Easing.SinInOut);
+
+ if (((Frame)sender).Parent is Layout layout)
+ {
+ this.layout = layout;
+ }
+ }
+
+ void OnGradientChanged(object sender, TextChangedEventArgs e)
+ {
+ if (!(sender is BindableObject bindable) || !(bindable.BindingContext is GradientStop gradientStop))
+ {
+ return;
+ }
+
+ gradientStop.Color = GetColorFromString(e.NewTextValue);
+ UpdateBackground();
+ }
+
+ void OnStartPointChanged(object sender, TextChangedEventArgs e)
+ {
+ startPoint = GetPointFromString(e.NewTextValue);
+ UpdateBackground();
+ }
+
+ void OnEndPointChanged(object sender, TextChangedEventArgs e)
+ {
+ endPoint = GetPointFromString(e.NewTextValue);
+ UpdateBackground();
+ }
+
+ void OnAddButtonClicked(object sender, EventArgs e)
+ {
+ offsets++;
+ gradientStops.Add(new GradientStop());
+ UpdateOffsets();
+ }
+
+ void OnRemoveButtonClicked(object sender, EventArgs e)
+ {
+ if (gradientStops.Count <= 0)
+ {
+ return;
+ }
+
+ offsets--;
+ gradientStops.Remove(gradientStops.Last());
+ UpdateOffsets();
+ UpdateBackground();
+ }
+
+ #endregion
+
+ #region Helpers
+
+ Color GetColorFromString(string value)
+ {
+ if (string.IsNullOrWhiteSpace(value))
+ {
+ return Color.Default;
+ }
+
+ try
+ {
+ return Color.FromHex(value[0].Equals('#') ? value : $"#{value}");
+ }
+ catch (Exception)
+ {
+ return Color.Default;
+ }
+ }
+
+ Point GetPointFromString(string value)
+ {
+ if (string.IsNullOrWhiteSpace(value))
+ {
+ return new Point();
+ }
+
+ try
+ {
+ string[] values = value.Split(',');
+ return new Point(Convert.ToDouble(values[0]), Convert.ToDouble(values[1]));
+ }
+ catch (Exception)
+ {
+ return new Point();
+ }
+ }
+
+ void UpdateBackground()
+ {
+ if (startPoint == null || endPoint == null || gradientStops == null)
+ {
+ return;
+ }
+
+ LinearGradientBrush brush = new LinearGradientBrush
+ {
+ StartPoint = startPoint,
+ EndPoint = endPoint,
+ GradientStops = gradientStops
+ };
+
+ if (brush.IsEmpty)
+ {
+ return;
+ }
+
+ gradientFrame.Background = brush;
+ }
+
+ void UpdateOffsets()
+ {
+ float offset = 0f;
+ float delta = 1f / (offsets - 1);
+
+ foreach (GradientStop gradientStop in gradientStops)
+ {
+ gradientStop.Offset = offset;
+ offset += delta;
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/MainPage.xaml b/UserInterface/BrushDemos/BrushesDemos/Views/MainPage.xaml
new file mode 100644
index 0000000000..9f025b0f55
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/MainPage.xaml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/MainPage.xaml.cs b/UserInterface/BrushDemos/BrushesDemos/Views/MainPage.xaml.cs
new file mode 100644
index 0000000000..3998c82a60
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/MainPage.xaml.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Windows.Input;
+using Xamarin.Forms;
+
+namespace BrushesDemos
+{
+ public partial class MainPage : ContentPage
+ {
+ public ICommand NavigateCommand { get; private set; }
+
+ public MainPage()
+ {
+ InitializeComponent();
+
+ NavigateCommand = new Command(
+ async (Type pageType) =>
+ {
+ Page page = (Page)Activator.CreateInstance(pageType);
+ await Navigation.PushAsync(page);
+ });
+
+ BindingContext = this;
+ }
+ }
+}
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/RadialGradientBrushDemoPage.xaml b/UserInterface/BrushDemos/BrushesDemos/Views/RadialGradientBrushDemoPage.xaml
new file mode 100644
index 0000000000..75838823e2
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/RadialGradientBrushDemoPage.xaml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/RadialGradientBrushDemoPage.xaml.cs b/UserInterface/BrushDemos/BrushesDemos/Views/RadialGradientBrushDemoPage.xaml.cs
new file mode 100644
index 0000000000..52b14b5351
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/RadialGradientBrushDemoPage.xaml.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+
+using Xamarin.Forms;
+
+namespace BrushesDemos.Views
+{
+ public partial class RadialGradientBrushDemoPage : ContentPage
+ {
+ public RadialGradientBrushDemoPage()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/RadialGradientBrushExplorerPage.xaml b/UserInterface/BrushDemos/BrushesDemos/Views/RadialGradientBrushExplorerPage.xaml
new file mode 100644
index 0000000000..a498ca3e11
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/RadialGradientBrushExplorerPage.xaml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/RadialGradientBrushExplorerPage.xaml.cs b/UserInterface/BrushDemos/BrushesDemos/Views/RadialGradientBrushExplorerPage.xaml.cs
new file mode 100644
index 0000000000..e708eb30cb
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/RadialGradientBrushExplorerPage.xaml.cs
@@ -0,0 +1,191 @@
+using System;
+using System.Linq;
+using BrushesDemos.Controls;
+using Xamarin.Forms;
+
+namespace BrushesDemos.Views
+{
+ public partial class RadialGradientBrushExplorerPage : ContentPage
+ {
+ const uint AnimationSpeed = 200;
+
+ Point center;
+ int offsets;
+ GradientStopCollection gradientStops;
+ Layout layout;
+
+ public RadialGradientBrushExplorerPage()
+ {
+ InitializeComponent();
+ BindingContext = this;
+
+ gradientStops = new GradientStopCollection();
+ BindableLayout.SetItemsSource(gradientsStackLayout, gradientStops);
+ }
+
+ #region Overrides
+
+ protected override void OnAppearing()
+ {
+ base.OnAppearing();
+ gradientColorPicker.ColorSelected += OnGradientColorPickerColorSelected;
+ }
+
+ protected override void OnDisappearing()
+ {
+ base.OnDisappearing();
+ gradientColorPicker.ColorSelected -= OnGradientColorPickerColorSelected;
+ }
+
+ #endregion
+
+ #region Event handlers
+
+ void OnGradientColorPickerColorSelected(object sender, ColorSource e)
+ {
+ gradientColorPicker.FadeTo(0, 0, Easing.SinInOut);
+ gradientColorPicker.TranslateTo(0, 1000, 0, Easing.SinInOut);
+
+ ColorSource selectedColor = gradientColorPicker.SelectedColorSource;
+
+ if (selectedColor == null)
+ {
+ return;
+ }
+
+ if (!(layout.Children.FirstOrDefault() is Entry entry))
+ {
+ return;
+ }
+
+ int red = (int)(selectedColor.Color.R * 255);
+ int green = (int)(selectedColor.Color.G * 255);
+ int blue = (int)(selectedColor.Color.B * 255);
+
+ entry.Text = $"#{red:X2}{green:X2}{blue:X2}";
+ }
+
+ void OnColorPickerTapped(object sender, EventArgs e)
+ {
+ gradientColorPicker.FadeTo(1, AnimationSpeed, Easing.SinInOut);
+ gradientColorPicker.TranslateTo(0, 0, AnimationSpeed, Easing.SinInOut);
+
+ if (((Frame)sender).Parent is Layout layout)
+ {
+ this.layout = layout;
+ }
+ }
+
+ void OnGradientChanged(object sender, TextChangedEventArgs e)
+ {
+ if (!(sender is BindableObject bindable) || !(bindable.BindingContext is GradientStop gradientStop))
+ {
+ return;
+ }
+
+ gradientStop.Color = GetColorFromString(e.NewTextValue);
+ UpdateBackground();
+ }
+
+ void OnAddButtonClicked(object sender, EventArgs e)
+ {
+ offsets++;
+ gradientStops.Add(new GradientStop());
+ UpdateOffsets();
+ }
+
+ void OnRemoveButtonClicked(object sender, EventArgs e)
+ {
+ if (gradientStops.Count <= 0)
+ {
+ return;
+ }
+
+ offsets--;
+ gradientStops.Remove(gradientStops.Last());
+ UpdateOffsets();
+ UpdateBackground();
+ }
+
+ void OnCenterChanged(object sender, TextChangedEventArgs e)
+ {
+ center = GetPointFromString(e.NewTextValue);
+ UpdateBackground();
+ }
+
+ #endregion
+
+ #region Helpers
+
+ Color GetColorFromString(string value)
+ {
+ if (string.IsNullOrWhiteSpace(value))
+ {
+ return Color.Default;
+ }
+
+ try
+ {
+ return Color.FromHex(value[0].Equals('#') ? value : $"#{value}");
+ }
+ catch (Exception)
+ {
+ return Color.Default;
+ }
+ }
+
+ Point GetPointFromString(string value)
+ {
+ if (string.IsNullOrWhiteSpace(value))
+ {
+ return new Point();
+ }
+
+ try
+ {
+ string[] values = value.Split(',');
+ return new Point(Convert.ToDouble(values[0]), Convert.ToDouble(values[1]));
+ }
+ catch (Exception)
+ {
+ return new Point();
+ }
+ }
+
+ void UpdateBackground()
+ {
+ if (center == null || gradientStops == null)
+ {
+ return;
+ }
+
+ RadialGradientBrush brush = new RadialGradientBrush
+ {
+ Center = center,
+ Radius = 1d,
+ GradientStops = gradientStops
+ };
+
+ if (brush.IsEmpty)
+ {
+ return;
+ }
+
+ gradientFrame.Background = brush;
+ }
+
+ void UpdateOffsets()
+ {
+ float offset = 0f;
+ float delta = 1f / (offsets - 1);
+
+ foreach (GradientStop gradientStop in gradientStops)
+ {
+ gradientStop.Offset = offset;
+ offset += delta;
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/SolidColorBrushDemoPage.xaml b/UserInterface/BrushDemos/BrushesDemos/Views/SolidColorBrushDemoPage.xaml
new file mode 100644
index 0000000000..0052e755ee
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/SolidColorBrushDemoPage.xaml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/SolidColorBrushDemoPage.xaml.cs b/UserInterface/BrushDemos/BrushesDemos/Views/SolidColorBrushDemoPage.xaml.cs
new file mode 100644
index 0000000000..7ab60534ce
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/SolidColorBrushDemoPage.xaml.cs
@@ -0,0 +1,12 @@
+using Xamarin.Forms;
+
+namespace BrushesDemos.Views
+{
+ public partial class SolidColorBrushDemoPage : ContentPage
+ {
+ public SolidColorBrushDemoPage()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/UpdateBrushDemoPage.xaml b/UserInterface/BrushDemos/BrushesDemos/Views/UpdateBrushDemoPage.xaml
new file mode 100644
index 0000000000..996cffd810
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/UpdateBrushDemoPage.xaml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UserInterface/BrushDemos/BrushesDemos/Views/UpdateBrushDemoPage.xaml.cs b/UserInterface/BrushDemos/BrushesDemos/Views/UpdateBrushDemoPage.xaml.cs
new file mode 100644
index 0000000000..5797a4266b
--- /dev/null
+++ b/UserInterface/BrushDemos/BrushesDemos/Views/UpdateBrushDemoPage.xaml.cs
@@ -0,0 +1,67 @@
+using System;
+using Xamarin.Forms;
+
+namespace BrushesDemos.Views
+{
+ public partial class UpdateBrushDemoPage : ContentPage
+ {
+ readonly Random random;
+
+ public UpdateBrushDemoPage()
+ {
+ InitializeComponent();
+ random = new Random();
+
+ UpdateBrushes();
+ Device.StartTimer(TimeSpan.FromSeconds(1), () =>
+ {
+ UpdateBrushes();
+ return true;
+ });
+ }
+
+ void UpdateBrushes()
+ {
+ Color randomColor1 = GetRandomColor();
+ Color randomColor2 = GetRandomColor();
+
+ SolidColorBrush solidColorBrush = new SolidColorBrush
+ {
+ Color = randomColor1
+ };
+
+ LinearGradientBrush linearGradientBrush = new LinearGradientBrush
+ {
+ // StartPoint defaults to (0,0). EndPoint defaults to (1,1).
+ GradientStops =
+ {
+ new GradientStop { Color = randomColor1, Offset = 0.1f },
+ new GradientStop { Color = randomColor2, Offset = 1.0f }
+ }
+ };
+
+ RadialGradientBrush radialGradientBrush = new RadialGradientBrush
+ {
+ // Center defaults to (0.5,0,5).
+ Radius = 0.75,
+ GradientStops =
+ {
+ new GradientStop { Color = randomColor1, Offset = 0.1f },
+ new GradientStop { Color = randomColor2, Offset = 1.0f }
+ }
+ };
+
+ solidColorFrame.Background = solidColorBrush;
+ linearGradientFrame.Background = linearGradientBrush;
+ radialGradientFrame.Background = radialGradientBrush;
+ }
+
+ Color GetRandomColor()
+ {
+ return Color.FromRgb(random.Next(256), random.Next(256), random.Next(256));
+ }
+ }
+}
+
+
+
\ No newline at end of file
diff --git a/UserInterface/BrushDemos/README.md b/UserInterface/BrushDemos/README.md
new file mode 100755
index 0000000000..ce1d9d049d
--- /dev/null
+++ b/UserInterface/BrushDemos/README.md
@@ -0,0 +1,20 @@
+---
+name: Xamarin.Forms - Brushes
+description: "This sample demonstrates how to use Xamarin.Forms Brushes (UI)"
+page_type: sample
+languages:
+- csharp
+products:
+- xamarin
+extensions:
+ tags:
+ - ui
+urlFragment: userinterface-brushdemos
+---
+# Brushes
+
+This sample demonstrates how to paint an area with a Xamarin.Forms brush.
+
+For more information about this sample, see [Xamarin.Forms Brushes](https://docs.microsoft.com/xamarin/xamarin-forms/user-interface/brushes/).
+
+
diff --git a/UserInterface/BrushDemos/Screenshots/01All.png b/UserInterface/BrushDemos/Screenshots/01All.png
new file mode 100644
index 0000000000..015bd68f26
Binary files /dev/null and b/UserInterface/BrushDemos/Screenshots/01All.png differ
diff --git a/UserInterface/CollectionViewDemos/CollectionViewDemos.Android/CollectionViewDemos.Android.csproj b/UserInterface/CollectionViewDemos/CollectionViewDemos.Android/CollectionViewDemos.Android.csproj
index e51636c7f7..40113841c8 100644
--- a/UserInterface/CollectionViewDemos/CollectionViewDemos.Android/CollectionViewDemos.Android.csproj
+++ b/UserInterface/CollectionViewDemos/CollectionViewDemos.Android/CollectionViewDemos.Android.csproj
@@ -49,7 +49,7 @@
- 4.7.0.968
+ 4.8.0.1269
diff --git a/UserInterface/CollectionViewDemos/CollectionViewDemos.iOS/CollectionViewDemos.iOS.csproj b/UserInterface/CollectionViewDemos/CollectionViewDemos.iOS/CollectionViewDemos.iOS.csproj
index 6b13e7c494..4709daa291 100644
--- a/UserInterface/CollectionViewDemos/CollectionViewDemos.iOS/CollectionViewDemos.iOS.csproj
+++ b/UserInterface/CollectionViewDemos/CollectionViewDemos.iOS/CollectionViewDemos.iOS.csproj
@@ -156,7 +156,7 @@
- 4.7.0.968
+ 4.8.0.1269
diff --git a/UserInterface/CollectionViewDemos/CollectionViewDemos/CollectionViewDemos.csproj b/UserInterface/CollectionViewDemos/CollectionViewDemos/CollectionViewDemos.csproj
index ddeebd2354..dbc5a79161 100644
--- a/UserInterface/CollectionViewDemos/CollectionViewDemos/CollectionViewDemos.csproj
+++ b/UserInterface/CollectionViewDemos/CollectionViewDemos/CollectionViewDemos.csproj
@@ -67,6 +67,6 @@
-
+
diff --git a/UserInterface/CollectionViewDemos/CollectionViewDemos/Views/HeadersAndFooters/HorizontalGridHeaderFooterViewPage.xaml b/UserInterface/CollectionViewDemos/CollectionViewDemos/Views/HeadersAndFooters/HorizontalGridHeaderFooterViewPage.xaml
index b6f89ce9c7..913aa86dd8 100644
--- a/UserInterface/CollectionViewDemos/CollectionViewDemos/Views/HeadersAndFooters/HorizontalGridHeaderFooterViewPage.xaml
+++ b/UserInterface/CollectionViewDemos/CollectionViewDemos/Views/HeadersAndFooters/HorizontalGridHeaderFooterViewPage.xaml
@@ -4,11 +4,8 @@
x:Class="CollectionViewDemos.Views.HorizontalGridHeaderFooterView"
Title="Grid header and footer (View)">
-
-
-
-
+