Подтвердить что ты не робот

Получить название приложения Windows Phone 7 из кода

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

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

4b9b3361

Ответ 1

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

    /// <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);
        }
    }

Ответ 2

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

                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;
                }

Ответ 3

Я использовал Michael S. Scherotter свой отличный образец кода, чтобы разобраться с полностью работающим образцом кода:

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
    }
}

Ответ 4

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

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

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

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

Ответ 5

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

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

Я создал этот Gist, чтобы продемонстрировать.

НТН!