2010-08-05 13 views
10

Quiero acceder al valor del título que está almacenado en el archivo WMAppManifest.xml de mi código de ViewModel. Este es el mismo título de la aplicación que se establece a través de las propiedades del proyecto.Obtener el título de la aplicación Windows Phone 7 del código

¿Hay alguna manera de acceder a esto desde el código usando algo como App.Current?

Respuesta

12

Mire the source code para WP7DataCollector.GetAppAttribute() en el Microsoft Silverlight Analytics Framework. GetAppAttribute ("Título") lo hará.

/// <summary> 
    /// Gets an attribute from the Windows Phone App Manifest App element 
    /// </summary> 
    /// <param name="attributeName">the attribute name</param> 
    /// <returns>the attribute value</returns> 
    private static string GetAppAttribute(string attributeName) 
    { 
     string appManifestName = "WMAppManifest.xml"; 
     string appNodeName = "App"; 

     var settings = new XmlReaderSettings(); 
     settings.XmlResolver = new XmlXapResolver(); 

     using (XmlReader rdr = XmlReader.Create(appManifestName, settings)) 
     { 
      rdr.ReadToDescendant(appNodeName); 
      if (!rdr.IsStartElement()) 
      { 
       throw new System.FormatException(appManifestName + " is missing " + appNodeName); 
      } 

      return rdr.GetAttribute(attributeName); 
     } 
    } 
+1

Esta solución no funciona cuando estamos utilizando recursos localizados: @ AppResLib.dll, -101. –

1

Esta última respuesta me parece demasiado complicada; simplemente usted puede hacer algo como:

   string name = ""; 
       var executingAssembly = System.Reflection.Assembly.GetExecutingAssembly(); 
       var customAttributes = executingAssembly.GetCustomAttributes(typeof(System.Reflection.AssemblyTitleAttribute), false); 
       if (customAttributes != null) 
       { 
        var assemblyName = customAttributes[0] as System.Reflection.AssemblyTitleAttribute; 
        name = assemblyName.Title; 
       } 
1

he utilizado Michael S. Scherotter su excelente ejemplo de código de resolverlo a un ejemplo de código completamente de trabajo:

using System.Xml; 

namespace KoenZomers.WinPhone.Samples 
{ 
    /// <summary> 
    /// Allows application information to be retrieved 
    /// </summary> 
    public static class ApplicationInfo 
    { 
     #region Constants 

     /// <summary> 
     /// Filename of the application manifest contained within the XAP file 
     /// </summary> 
     private const string AppManifestName = "WMAppManifest.xml"; 

     /// <summary> 
     /// Name of the XML element containing the application information 
     /// </summary> 
     private const string AppNodeName = "App"; 

     #endregion 

     #region Properties 

     /// <summary> 
     /// Gets the application title 
     /// </summary> 
     public static string Title 
     { 
      get { return GetAppAttribute("Title"); } 
     } 

     /// <summary> 
     /// Gets the application description 
     /// </summary> 
     public static string Description 
     { 
      get { return GetAppAttribute("Description"); } 
     } 

     /// <summary> 
     /// Gets the application version 
     /// </summary> 
     public static string Version 
     { 
      get { return GetAppAttribute("Version"); } 
     } 

     /// <summary> 
     /// Gets the application publisher 
     /// </summary> 
     public static string Publisher 
     { 
      get { return GetAppAttribute("Publisher"); } 
     } 

     /// <summary> 
     /// Gets the application author 
     /// </summary> 
     public static string Author 
     { 
      get { return GetAppAttribute("Author"); } 
     } 

     #endregion 

     #region Methods   

     /// <summary> 
     /// Gets an attribute from the Windows Phone App Manifest App element 
     /// </summary> 
     /// <param name="attributeName">the attribute name</param> 
     /// <returns>the attribute value</returns> 
     private static string GetAppAttribute(string attributeName) 
     { 
      var settings = new XmlReaderSettings {XmlResolver = new XmlXapResolver()}; 

      using (var rdr = XmlReader.Create(AppManifestName, settings)) 
      { 
       rdr.ReadToDescendant(AppNodeName); 

       // Return the value of the requested XML attribute if found or NULL if the XML element with the application information was not found in the application manifest 
       return !rdr.IsStartElement() ? null : rdr.GetAttribute(attributeName); 
      } 
     } 

     #endregion 
    } 
} 
1

Sólo las dos primeras respuestas son correcto en el alcance de la pregunta original. Y el segundo ciertamente no es demasiado complicado. Envolver el método de ayuda con una clase para cada atributo posible es un buen desarrollo orientado a objetos y exactamente lo que Microsoft hace en todo el marco, p. configuración de los archivos de diseño generados por Visual Studio.

Recomiendo usar la primera si solo quieres una propiedad específica, la segunda si quieres más. Debería ser parte del SDK realmente. Estamos intentando leer el WMAppManifest.xml aquí, no el AssemblyInfo, por lo que los metadatos de reflexión de ensamblaje estándar no son buenos.

Por cierto, si realmente desea obtener el nombre del producto a partir de los atributos de ensamblaje (no WPAppManifest.xml), entonces la última muestra fue leer el atributo equivocado! Use AssemblyProductAttribute, no AssemblyTitleAttribute. El título del ensamblado es realmente el título del archivo, por defecto es el mismo que el nombre del archivo de ensamblaje (p. Ej. MyCompany.MyProduct.WinPhone7App) mientras que el producto será algo así como el "título" de su aplicación en la tienda (por ejemplo, "Mi Producto"). Puede que ni siquiera esté actualizado después de usar la página de propiedades de VS, por lo que debe verificarlo.

Uso la reflexión AssemblyInfo para todos los demás tipos de aplicaciones para mostrar el nombre oficial del producto y la versión de compilación en una página sobre, sin duda es correcto. Pero para estos tipos especiales de aplicaciones para teléfonos, el manifiesto de la tienda tiene más importancia y otros atributos que pueda necesitar.

0

El problema con todas esas respuestas es que tienen que leer el archivo cada vez que se accede. Esto es malo para el rendimiento, ya que hay problemas de batería a considerar si lo usa con frecuencia. Koen estaba más cerca de una solución adecuada, pero su diseño aún volvía al archivo cada vez que quería acceder al valor.

La siguiente solución es una lectura única del archivo. Como no es probable que cambie, no hay razón para seguir volviendo. Los atributos se leen cuando se inicializa la clase estática, con un alboroto mínimo.

I created this Gist to demonstrate.

HTH!

Cuestiones relacionadas