2010-08-05 21 views
10

Tôi muốn truy cập vào giá trị Tiêu đề được lưu trữ trong tệp WMAppManifest.xml từ mã ViewModel của tôi. Đây là cùng một tiêu đề ứng dụng được thiết lập thông qua các thuộc tính của dự án.Lấy Tiêu đề Ứng dụng Windows Phone 7 từ Mã số

Có cách nào để truy cập từ mã này bằng cách sử dụng một cái gì đó như App.Current không?

Trả lời

12

Nhìn vào the source code cho WP7DataCollector.GetAppAttribute() trong Microsoft Silverlight Analytics Framework. GetAppAttribute ("Tiêu đề") sẽ làm điều đó.

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

Giải pháp này không hoạt động khi chúng tôi đang sử dụng tài nguyên được bản địa hóa: @ AppResLib.dll, -101. –

1

Câu trả lời cuối cùng này dường như quá phức tạp đối với tôi; bạn có thể chỉ đơn giản là thực hiện một cái gì đó như:

   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

Tôi đã sử dụng Michael S. Scherotter mẫu mã tuyệt vời của mình để làm việc nó ra một mẫu mã hoàn toàn làm việc:

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

Chỉ có hai câu trả lời đầu tiên là đúng trong phạm vi của câu hỏi gốc. Và thứ hai chắc chắn không quá phức tạp. Bao bọc phương thức trợ giúp với một lớp cho mỗi thuộc tính có thể là phát triển định hướng đối tượng tốt và chính xác những gì Microsoft làm trên toàn bộ khuôn khổ, ví dụ: thiết lập các tệp thiết kế được tạo bởi Visual Studio.

Tôi khuyên bạn nên sử dụng mục đầu tiên nếu bạn chỉ muốn một thuộc tính cụ thể, thứ hai nếu bạn muốn nhiều hơn. Phải là một phần của SDK thực sự. Chúng tôi đang cố gắng đọc WMAppManifest.xml ở đây không phải là AssemblyInfo vì vậy siêu dữ liệu phản ánh tiêu chuẩn lắp ráp là không tốt.

Nhân tiện, nếu bạn thực sự muốn lấy tên sản phẩm từ các thuộc tính assembly (không phải là WPAppManifest.xml) thì mẫu cuối cùng đã đọc thuộc tính sai! Sử dụng AssemblyProductAttribute không phải là AssemblyTitleAttribute. Tiêu đề lắp ráp thực sự là tiêu đề tệp, theo mặc định giống như tên tệp lắp ráp (ví dụ: MyCompany.MyProduct.WinPhone7App) trong khi sản phẩm thường sẽ giống như "tiêu đề" được định dạng đúng của ứng dụng của bạn trong cửa hàng (ví dụ: "My Sản phẩm "). Nó thậm chí có thể không được cập nhật sau khi sử dụng trang thuộc tính VS, vì vậy bạn nên kiểm tra điều đó.

Tôi sử dụng phản ánh AssemblyInfo cho tất cả các loại ứng dụng khác để hiển thị tên sản phẩm chính thức và phiên bản xây dựng trên một trang giới thiệu, nó chắc chắn chính xác cho điều đó. Nhưng đối với các loại ứng dụng điện thoại đặc biệt này, tệp kê khai cửa hàng có tầm quan trọng hơn và các thuộc tính khác mà bạn có thể cần.

0

Vấn đề với tất cả các câu trả lời đó là họ phải đọc tệp mỗi khi được truy cập. Điều này là xấu cho hiệu suất như có vấn đề pin để xem xét nếu bạn sử dụng nó thường xuyên. Koen đã gần gũi hơn với một giải pháp thích hợp, nhưng thiết kế của anh ấy vẫn quay trở lại tệp mỗi lần bạn muốn truy cập vào giá trị.

Giải pháp dưới đây là đọc một lần và hoàn thành tệp. Vì nó không có khả năng thay đổi, không có lý do gì để tiếp tục quay trở lại nó. Các thuộc tính được đọc là lớp tĩnh được khởi tạo, với ít phiền phức.

I created this Gist to demonstrate.

HTH!

Các vấn đề liên quan