private static bool IsAssemblyInfoFilled(UriDescription description)
        {
            if (string.IsNullOrEmpty(description.AssemblyName))
            {
                return(false);
            }

            return(!string.IsNullOrEmpty(description.AssemblyVersion) ||
                   !string.IsNullOrEmpty(description.AssemblyPublicKeyToken));
        }
        private static Uri CreateUri(UriDescription description)
        {
            Debug.Assert(description != null);

            return(SharedThemeResourceDictionary.CreateUri(
                       description.AssemblyName,
                       description.AssemblyVersion,
                       description.AssemblyPublicKeyToken,
                       description.RelativePath));
        }
        private static bool TryGetUriDescription(Uri uri, out UriDescription description)
        {
            description = null;
            if ((uri == null) || !uri.IsAbsoluteUri)
            {
                return(false);
            }

            if (!string.Equals(uri.Scheme, SharedThemeResourceDictionary.UriSchemePack, StringComparison.InvariantCultureIgnoreCase))
            {
                return(false);
            }

            var segments = uri.Segments;

            if ((segments == null) || (segments.Length < 2))
            {
                return(false);
            }

            var componentPart = segments[1];
            var index         = componentPart.IndexOf(SharedThemeResourceDictionary.UriComponent, StringComparison.InvariantCultureIgnoreCase);

            if (index < 0)
            {
                return(false);
            }

            string assemblyName           = null;
            string assemblyVersion        = null;
            string assemblyPublicKeyToken = null;

            var assemblyInfo = componentPart.Substring(0, index);

            if (assemblyInfo.Length > 0)
            {
                var assemblyParts = assemblyInfo.Split(new string[] { SharedThemeResourceDictionary.UriAssemblyInfoSeparator }, StringSplitOptions.None);
                Debug.Assert(assemblyParts.Length <= 3);

                assemblyName           = (assemblyParts.Length > 0) ? assemblyParts[0] : null;
                assemblyVersion        = (assemblyParts.Length > 1) ? SharedThemeResourceDictionary.ParseAssemblyVersion(assemblyParts[1]) : null;
                assemblyPublicKeyToken = (assemblyParts.Length > 2) ? assemblyParts[2] : null;
            }

            string relativePath = null;

            if (segments.Length > 2)
            {
                var sb = new StringBuilder();
                for (int i = 2; i < segments.Length; i++)
                {
                    sb.Append(segments[i]);
                }

                relativePath = sb.ToString();
            }

            description = new UriDescription(assemblyName, assemblyVersion, assemblyPublicKeyToken, relativePath);

            return(true);
        }
    private static bool TryGetUriDescription( Uri uri, out UriDescription description )
    {
      description = null;
      if( ( uri == null ) || !uri.IsAbsoluteUri )
        return false;

      if( !string.Equals( uri.Scheme, SharedThemeResourceDictionary.UriSchemePack, StringComparison.InvariantCultureIgnoreCase ) )
        return false;

      var segments = uri.Segments;
      if( ( segments == null ) || ( segments.Length < 2 ) )
        return false;

      var componentPart = segments[ 1 ];
      var index = componentPart.IndexOf( SharedThemeResourceDictionary.UriComponent, StringComparison.InvariantCultureIgnoreCase );
      if( index < 0 )
        return false;

      string assemblyName = null;
      string assemblyVersion = null;
      string assemblyPublicKeyToken = null;

      var assemblyInfo = componentPart.Substring( 0, index );
      if( assemblyInfo.Length > 0 )
      {
        var assemblyParts = assemblyInfo.Split( new string[] { SharedThemeResourceDictionary.UriAssemblyInfoSeparator }, StringSplitOptions.None );
        Debug.Assert( assemblyParts.Length <= 3 );

        assemblyName = ( assemblyParts.Length > 0 ) ? assemblyParts[ 0 ] : null;
        assemblyVersion = ( assemblyParts.Length > 1 ) ? SharedThemeResourceDictionary.ParseAssemblyVersion( assemblyParts[ 1 ] ) : null;
        assemblyPublicKeyToken = ( assemblyParts.Length > 2 ) ? assemblyParts[ 2 ] : null;
      }

      string relativePath = null;

      if( segments.Length > 2 )
      {
        var sb = new StringBuilder();
        for( int i = 2; i < segments.Length; i++ )
        {
          sb.Append( segments[ i ] );
        }

        relativePath = sb.ToString();
      }

      description = new UriDescription( assemblyName, assemblyVersion, assemblyPublicKeyToken, relativePath );

      return true;
    }
    private static bool IsAssemblyInfoFilled( UriDescription description )
    {
      if( string.IsNullOrEmpty( description.AssemblyName ) )
        return false;

      return !string.IsNullOrEmpty( description.AssemblyVersion )
          || !string.IsNullOrEmpty( description.AssemblyPublicKeyToken );
    }
    private static Uri CreateUri( UriDescription description )
    {
      Debug.Assert( description != null );

      return SharedThemeResourceDictionary.CreateUri(
               description.AssemblyName,
               description.AssemblyVersion,
               description.AssemblyPublicKeyToken,
               description.RelativePath );
    }