Получить название приложения для Windows Phone 7 из кода - PullRequest
10 голосов
/ 05 августа 2010

Я хочу получить доступ к значению заголовка, которое хранится в файле WMAppManifest.xml, из моего кода ViewModel.Это тот же заголовок приложения, который задается через свойства проекта.

Есть ли способ получить к нему доступ из кода, используя что-то вроде App.Current?

Ответы [ 5 ]

12 голосов
/ 05 августа 2010

Посмотрите исходный код для WP7DataCollector.GetAppAttribute () в Microsoft Silverlight Analytics Framework .GetAppAttribute ("Title") сделает это.

    /// <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 голос
/ 29 сентября 2012

Только первые два ответа верны в объеме исходного вопроса. И второе конечно не слишком сложно. Обертывание вспомогательного метода классом для каждого возможного атрибута - это хорошая объектно-ориентированная разработка и именно то, что Microsoft делает во всей среде, например. файлы конструктора параметров, сгенерированные Visual Studio.

Я бы порекомендовал использовать первое, если вы просто хотите одно конкретное свойство, второе, если вы хотите больше. Должно быть частью SDK действительно. Мы пытаемся прочитать WMAppManifest.xml здесь, а не AssemblyInfo, поэтому стандартные метаданные отражения сборки не годятся.

Кстати, если вы действительно хотите получить название продукта из атрибутов сборки (не WPAppManifest.xml), тогда последний пример считывал неправильный атрибут! Используйте атрибут AssemblyProductAttribute, а не AssemblyTitleAttribute. Заголовок сборки - это действительно заголовок файла, по умолчанию он совпадает с именем файла сборки (например, MyCompany.MyProduct.WinPhone7App), тогда как продукт, как правило, будет выглядеть как правильно отформатированный заголовок вашего приложения в магазине (например, «Мой Товар"). Он может даже не обновляться после использования страницы свойств VS, поэтому вы должны проверить это.

Я использую сборку AssemblyInfo для всех других типов приложений, чтобы показать официальное название продукта и версию сборки на странице about, это, безусловно, правильно. Но для этих специальных типов телефонных приложений манифест магазина имеет большее значение и другие атрибуты, которые могут вам понадобиться.

1 голос
/ 06 августа 2012

Я использовал Майкл С. Шероттер, его превосходный пример кода, чтобы превратить его в полностью рабочий пример кода:

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 голос
/ 27 января 2012

Этот последний ответ кажется мне слишком сложным;Вы могли бы просто сделать что-то вроде:

                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;
                }
0 голосов
/ 21 января 2013

Проблема со всеми этими ответами заключается в том, что они должны читать файл каждый раз, когда к нему обращаются.Это плохо сказывается на производительности, так как есть проблемы с батареей, которые следует учитывать при частом использовании.Коен был ближе к правильному решению, но его дизайн все еще возвращался к файлу каждый раз, когда вы хотели получить доступ к значению.

Решение, приведенное ниже, представляет собой одноразовое чтение файла.Поскольку это вряд ли изменится, нет причин продолжать возвращаться к нему.Атрибуты читаются при инициализации статического класса с минимальными усилиями.

Я создал этот Gist для демонстрации .

HTH!

...