程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 在dll中尋找Visual Studio中的圖標

在dll中尋找Visual Studio中的圖標

編輯:關於.NET

在以前的一篇文章:WF4.0工作流設計器,在WPF中宿主了一個工作流設計器 ,它的工具欄如下圖:

你會發現工具欄上的活動統統沒有圖標,而在Visual Studio中WF設計器工具 欄如下圖:

你會發現Visual Studio中的活動的圖標非常美觀。在你Visual Studio安裝 的目錄下,是沒有這些圖標的。好了,現在我將從dll中將這些圖標找出來。

首先鎖定目標:Microsoft.VisualStudio.Activities.dll 。將它從你的C盤 中找出來,拷貝到一個目錄下,我放在C:\\下面。使用下面這些代碼:

1、LoadToolboxIconsForBuiltInActivities,加載內置活動的圖標。

private static void LoadToolboxIconsForBuiltInActivities ()
   {
        AttributeTableBuilder builder = new  AttributeTableBuilder();
        Assembly sourceAssembly = Assembly.LoadFile (@"C:\Microsoft.VisualStudio.Activities.dll");
        System.Resources.ResourceReader resourceReader =  new System.Resources.ResourceReader(  sourceAssembly.GetManifestResourceStream ("Microsoft.VisualStudio.Activities.Resources.resources"));
        if (type.Namespace ==  "System.Activities.Statements")
         {
              CreateToolboxBitmapAttributeForActivity (builder, resourceReader, type);
         }
         MetadataStore.AddAttributeTable (builder.CreateTable());
    }

2、CreateToolboxBitmapAttributeForActivity

private static void  CreateToolboxBitmapAttributeForActivity(AttributeTableBuilder  builder, System.Resources.ResourceReader resourceReader, Type  builtInActivityType)
    {
      System.Drawing.Bitmap bitmap = ExtractBitmapResource (resourceReader, builtInActivityType.IsGenericType ?  builtInActivityType.Name.Split('`')[0] :  builtInActivityType.Name);
       if (bitmap != null)
          {
            Type tbaType = typeof (System.Drawing.ToolboxBitmapAttribute);
            Type imageType = typeof (System.Drawing.Image);
            ConstructorInfo constructor =  tbaType.GetConstructor(BindingFlags.Instance |  BindingFlags.NonPublic, null, new Type[] { imageType, imageType  }, null);
            System.Drawing.ToolboxBitmapAttribute tba =  constructor.Invoke(new object[] { bitmap, bitmap }) as  System.Drawing.ToolboxBitmapAttribute;
            builder.AddCustomAttributes (builtInActivityType, tba);
           }
     } 

3、ExtractBitmapResource

private static System.Drawing.Bitmap  ExtractBitmapResource(System.Resources.ResourceReader resourceReader,  string bitmapName)
         {
                 System.Collections.IDictionaryEnumerator dictEnum =  resourceReader.GetEnumerator();
                 System.Drawing.Bitmap bitmap =  null;
                 while (dictEnum.MoveNext())
                 {
                     if (String.Equals (dictEnum.Key, bitmapName))
                     {
                         bitmap =  dictEnum.Value as System.Drawing.Bitmap;
                         System.Drawing.Color pixel = bitmap.GetPixel(bitmap.Width-1,  0);
                         bitmap.MakeTransparent(pixel);
                         break;
                     }
                 }
             return bitmap;
        }

4、在工作流器宿主中添加下面代碼:

LoadToolboxIconsForBuiltInActivities();

重新運行你的設計器,你會有驚奇發現,如下圖:

有個別的活動圖標不在Microsoft.VisualStudio.Activities.dll 中,所以 仍然沒有顯示。

ps:本程序運行在Visual Studio2010 RC中

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved