Click here to Skip to main content
15,897,032 members
Articles / Desktop Programming / WPF

Smart WPF Login Overlay (Windows 8 Style)

Rate me:
Please Sign up or sign in to vote.
5.00/5 (23 votes)
3 Dec 2012CPOL12 min read 135.4K   18.1K   76  
Login Overlay for WPF applications with a styling similar to the Windows 8 Login Screen.
//	------------------------------------------------------------------
//		Member of the WPFSmartLibrary
//		For more information see : (coming soon ...)
//		(by DotNetMastermind)
//
//		filename		: VisibilityConverter.cs
//		namespace	: SoftArcs.WPFSmartLibrary.ValueConverter
//		class(es)	: BoolToVisibilityConverter
//						  BoolToVisibleOrHiddenConverter
//						  BoolToVisibleOrCollapsedConverter
//						  BoolToVisibleOrCollapsedOrHiddenConverter
//						  BooleanStringToVisibilityConverter
//						  StringToVisibilityConverter
//	------------------------------------------------------------------
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;

namespace SoftArcs.WPFSmartLibrary.ValueConverter
{
	/// <summary>
	/// Converts a Boolean value into a Visibility enumeration (and back)
	/// </summary>
	[ValueConversion( typeof( bool ), typeof( Visibility ) )]
	[MarkupExtensionReturnType( typeof( BoolToVisibilityConverter ) )]
	public class BoolToVisibilityConverter : MarkupExtension, IValueConverter
	{
		/// <summary>
		/// FalseEquivalent (default : Visibility.Collapsed => see Constructor)
		/// </summary>
		public Visibility FalseEquivalent { get; set; }
		/// <summary>
		/// Define whether the opposite boolean value is crucial (default : false)
		/// </summary>
		public bool OppositeBooleanValue { get; set; }

		/// <summary>
		/// Initialize the properties with standard values
		/// </summary>
		public BoolToVisibilityConverter()
		{
			this.FalseEquivalent = Visibility.Collapsed;
			this.OppositeBooleanValue = false;
		}

		//+------------------------------------------------------------------------
		//+ Usage :
		//+ -------
		//+ 1. <conv:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
		//+ 2. {Binding ... Converter={StaticResource BoolToVisibilityConverter}
		//+------------------------------------------------------------------------
		#region IValueConverter Members

		public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
		{
			if (value is bool && targetType == typeof( Visibility ))
			{
				bool? booleanValue = (bool?)value;

				if (this.OppositeBooleanValue == true)
				{
					booleanValue = !booleanValue;
				}

				return booleanValue.GetValueOrDefault() ? Visibility.Visible : FalseEquivalent;
			}

			return value;
		}

		public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
		{
			if (value is Visibility)
			{
				Visibility visibilityValue = (Visibility)value;

				if (this.OppositeBooleanValue == true)
				{
					visibilityValue = visibilityValue == Visibility.Visible ? FalseEquivalent : Visibility.Visible;
				}

				return (visibilityValue == Visibility.Visible);
			}

			return value;
		}

		#endregion // IValueConverter Members

		//+-----------------------------------------------------------------------------------
		//+ Usage :	(wpfsl: => XML Namespace mapping to the "BoolToVisibilityConverter" class)
		//+ -------
		//+ Use as follows : {Binding ... Converter={wpfsl:BoolToVisibilityConverter}
		//+ NO StaticResource required
		//+-----------------------------------------------------------------------------------
		#region MarkupExtension "overrides"

		public override object ProvideValue(IServiceProvider serviceProvider)
		{
			return new BoolToVisibilityConverter
						 {
							 FalseEquivalent = this.FalseEquivalent,
							 OppositeBooleanValue = this.OppositeBooleanValue
						 };
		}

		#endregion
	}

	/// <summary>
	/// Converts a Boolean value into a Visibility enumeration (and back)
	/// FalseEquivalent is always Visibility.Hidden
	///!Deprecated : It is recommended to use the more flexible 'BoolToVisibilityConverter' instead
	/// </summary>
	[ValueConversion( typeof( bool ), typeof( Visibility ) )]
	public class BoolToVisibleOrHiddenConverter : IValueConverter
	{
		#region IValueConverter Members

		public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
		{
			if (value is bool && targetType == typeof( Visibility ))
			{
				bool bValue = (bool)value;

				if (bValue)
					return Visibility.Visible;
				
				return Visibility.Hidden;
			}

			return value;
		}

		public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
		{
			if (value is Visibility)
			{
				Visibility visibility = (Visibility)value;

				if (visibility == Visibility.Visible)
					return true;

				return false;
			}

			return value;
		}

		#endregion
	}

	/// <summary>
	/// Converts a Boolean value into a Visibility enumeration (and back)
	/// FalseEquivalent is always Visibility.Collapsed
	///!Deprecated : It is recommended to use the more flexible 'BoolToVisibilityConverter' instead
	/// </summary>
	[ValueConversion( typeof( bool ), typeof( Visibility ) )]
	public class BoolToVisibleOrCollapsedConverter : IValueConverter
	{
		#region IValueConverter Members

		public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
		{
			if (value is bool && targetType == typeof( Visibility ))
			{
				return ((bool)value) ? Visibility.Visible : Visibility.Collapsed;
			}
			return value;
		}

		public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
		{
			if (value is Visibility)
			{
				return ((Visibility)value == Visibility.Visible);
			}
			return value;
		}

		#endregion
	}

	/// <summary>
	/// Converts a Boolean value into a Visibility enumeration (and back)
	/// FalseEquivalent can be defined with the property 'Collapse'
	///!Deprecated : It is recommended to use the more flexible 'BoolToVisibilityConverter' instead
	/// </summary>
	[ValueConversion( typeof( bool ), typeof( Visibility ) )]
	public class BoolToVisibleOrCollapsedOrHiddenConverter : IValueConverter
	{
		/// <summary>
		/// Collapse (default : Visibility.Hidden, because a bool is 'false' by default)
		/// true  => 'False-Equivalent' = Visibility.Collapsed
		/// false => 'False-Equivalent' = Visibility.Hidden
		/// </summary>
		public bool Collapse { get; set; }

		#region IValueConverter Members

		public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
		{
			if (value is bool && targetType == typeof( Visibility ))
			{
				bool bValue = (bool)value;

				if (bValue)
				{
					return Visibility.Visible;
				}

				if (Collapse)
				{
					return Visibility.Collapsed;
				}
				
				return Visibility.Hidden;
			}

			return value;
		}

		public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
		{
			if (value is Visibility)
			{
				Visibility visibility = (Visibility)value;

				if (visibility == Visibility.Visible)
					return true;
				
				return false;
			}

			return value;
		}

		#endregion // IValueConverter Members
	}

	/// <summary>
	/// Converts a String into a Visibility enumeration (and back)
	/// FalseEquivalent is always Visibility.Collapsed
	/// </summary>
	[ValueConversion( typeof( string ), typeof( Visibility ) )]
	[MarkupExtensionReturnType( typeof( BooleanStringToVisibilityConverter ) )]
	public class BooleanStringToVisibilityConverter : MarkupExtension, IValueConverter
	{
		#region IValueConverter Members

		public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
		{
			if (value is string && targetType == typeof( Visibility ))
			{
				return ((value as string).ToLower().Equals( "true" )) ? Visibility.Visible : Visibility.Collapsed;
			}
			return value;
		}

		public object ConvertBack(object value, Type targetType, object parameter,
										  CultureInfo culture)
		{
			if (value is Visibility)
			{
				return ((Visibility)value == Visibility.Visible) ? "true" : "false";
			}

			return value;
		}

		#endregion

		#region MarkupExtension "overrides"

		public override object ProvideValue(IServiceProvider serviceProvider)
		{
			return new BooleanStringToVisibilityConverter();
		}

		#endregion
	}

	/// <summary>
	/// Converts a String into a Visibility enumeration (and back)
	/// The FalseEquivalent can be declared with the "FalseEquivalent" property
	/// </summary>
	[ValueConversion( typeof( string ), typeof( Visibility ) )]
	[MarkupExtensionReturnType( typeof( StringToVisibilityConverter ) )]
	public class StringToVisibilityConverter : MarkupExtension, IValueConverter
	{
		/// <summary>
		/// FalseEquivalent (default : Visibility.Collapsed => see Constructor)
		/// </summary>
		public Visibility FalseEquivalent { get; set; }

		/// <summary>
		/// Define whether the opposite boolean value is crucial (default : false)
		/// </summary>
		public bool OppositeStringValue { get; set; }

		/// <summary>
		/// Initialize the properties with standard values
		/// </summary>
		public StringToVisibilityConverter()
		{
			this.FalseEquivalent = Visibility.Collapsed;
			this.OppositeStringValue = false;
		}

		#region IValueConverter Members

		public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
		{
			if (value is string && targetType == typeof( Visibility ))
			{
				if (this.OppositeStringValue == true)
				{
					return ((value as string).ToLower().Equals( String.Empty )) ? Visibility.Visible : this.FalseEquivalent;
				}

				return ((value as string).ToLower().Equals( String.Empty )) ? this.FalseEquivalent : Visibility.Visible;
			}

			return value;
		}

		public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
		{
			if (value is Visibility)
			{
				if (this.OppositeStringValue == true)
				{
					return ((Visibility)value == Visibility.Visible) ? String.Empty : "visible";
				}

				return ((Visibility)value == Visibility.Visible) ? "visible" : String.Empty;
			}

			return value;
		}

		#endregion

		#region MarkupExtension "overrides"

		public override object ProvideValue(IServiceProvider serviceProvider)
		{
			return new StringToVisibilityConverter
						 {
							 FalseEquivalent = this.FalseEquivalent,
							 OppositeStringValue = this.OppositeStringValue
						 };
		}

		#endregion
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect SoftArcs
Germany Germany
Experience:
More than 20 years with software design, architecture and development. More than 9 years with the .NET Framework.

Preferences:
C#, .NET 2.0, .NET 3.5, .NET 4.0, .NET 4.5, WPF (3, 4 and 4.5), MVVM, XAML, Silverlight, Windows Phone, Windows 8 Apps, ASP.NET, WCF, T-SQL and especially GUI-Development and GUI-Design.

I would say I am a dotNet Developer with a keen affinity for developing and enriching user interfaces.

Comments and Discussions