欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源

這篇文章將為大家詳細講解有關Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

成都網(wǎng)站建設、成都做網(wǎng)站中從網(wǎng)站色彩、結(jié)構布局、欄目設置、關鍵詞群組等細微處著手,突出企業(yè)的產(chǎn)品/服務/品牌,幫助企業(yè)鎖定精準用戶,提高在線咨詢和轉(zhuǎn)化,使成都網(wǎng)站營銷成為有效果、有回報的無錫營銷推廣。創(chuàng)新互聯(lián)公司專業(yè)成都網(wǎng)站建設10多年了,客戶滿意度97.8%,歡迎成都創(chuàng)新互聯(lián)客戶聯(lián)系。

前言

在開發(fā)Winform程序界面的時候,我們往往會使用一些較好看的圖表,以便能夠為我們的程序界面增色,良好的圖標設置可以讓界面看起來更加美觀舒服,而且也比較容易理解,圖標我們可以通過一些網(wǎng)站獲取各種場景的圖標資源,不過本篇隨筆主要介紹如何利用DevExpress的內(nèi)置圖標資源來實現(xiàn)界面圖標的設置。

下面話不多說了,來一起看看詳細的介紹吧

1、設計時刻的圖標處理

豐富的圖標處理,在菜單、工具欄、樹列表等地方,以及按鈕等地方,都可以使用,而這些我們可以利用DevExpress的內(nèi)置圖標選擇來減輕我們尋找合適圖標的煩惱。

Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源

一些按鈕、工具欄等的圖標設置,一般是固定的,我們往往可以在設計時刻就指定它,這樣我們可以使用本地的圖標,也可以使用DevExpress的內(nèi)置圖標。而使用DevExpress內(nèi)置圖標資源的時候,我們可以調(diào)出DevExpress的內(nèi)置圖標選擇框的。

如下是按鈕添加圖標方式,操作非常簡單,在按鈕的右上角小圖標上單擊一下進入編輯界面,如下所示。

Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源

然后選擇Image按鈕,進入圖標選擇界面,選擇內(nèi)置的DevExpress圖標庫即可,基本上,只要是DevExpress的原生控件,那么就可以通過這種內(nèi)置圖標的對話框進行圖標選擇,非常方便。

Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源

2、運行時刻的圖標處理

上面的操作是在設計時候,DevExpress設計器給我們提供很多便利選擇內(nèi)置圖標,而在界面運行時刻,想動態(tài)處理界面按鈕圖標,或者樹形菜單的圖標的時候,就沒有這個直接的接口來設置圖標了,而我們框架的菜單往往都是需用動態(tài)增加的,因此圖標的設置也是在運行時刻的。如下面的樹列表中,圖標就是動態(tài)指定的。

Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源

這些動態(tài)的樹形菜單,是在權限系統(tǒng)里面動態(tài)配置的,菜單的配置界面如下所示。

Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源

上面的選擇圖圖標就是我們需要動態(tài)設置的圖標,由于圖標資源我們是以圖片形式存儲在對應的記錄里面的,因此使用起來也是比較方便的,我們在配置的時候,獲取到對應的圖標資源并存儲起來即可。

除了上面可以參考從DevExpress內(nèi)置圖標資源獲取圖標的方式外

Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源

我們還可以選擇我們自己喜歡的圖標資源,也就是從系統(tǒng)圖標文件中選擇自己喜歡的,如下界面所示。

Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源

因此我考慮在運行時刻整合兩種不同選擇圖標的方式。

我們先來看看我整合后的圖表選擇界面,如下所示,包含了運行時刻提取DevExpress內(nèi)置圖標的功能和從系統(tǒng)文件中選擇圖標的功能。

Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源

3、運行時刻提取DevExpress內(nèi)置圖標的功能實現(xiàn)

首先我們參考設計時刻的界面展示

Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源

來設計一個界面來展示圖標信息

Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源

參考原版的界面,設計盡可能貼近即可,另外我們自己加入一個從系統(tǒng)選擇圖標資源的操作。

Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源

至于圖標選中后我們返回對應的Image對象給調(diào)用者,則通過事件進行處理,以便選中后,即使更新顯示效果。

如下所示,我們定義一個委托和事件。

/// <summary>
 /// DevExpress圖標和系統(tǒng)圖標選擇窗體
 /// </summary>
 public partial class FrmImageGallery : BaseForm
 {
  /// <summary>
  /// 自定義一個委托處理圖標選擇
  /// </summary>
  public delegate void IconSelectHandlerDelegate(Image image, string name);

  /// <summary>
  /// 圖標選擇的事件
  /// </summary>
  public event IconSelectHandlerDelegate OnIconSelected;

  private DXImageGalleryLoader loader = null;

  public FrmImageGallery()
  {
   InitializeComponent();

   InitDictItem();//初始化
  }  

  /// <summary>
  /// 處理圖標選擇的事件觸發(fā)
  /// </summary>
  public virtual void ProcessIconSelected(Image image, string name)
  {
   if (OnIconSelected != null)
   {
    OnIconSelected(image, name);
   }
  }

然后在內(nèi)置圖標顯示中,如果觸發(fā)圖標的單擊,我們就觸發(fā)事件,以便讓調(diào)用者更新界面顯示,如下代碼所示。

foreach (GalleryItem item in items[key])
{
 item.ItemClick += (s, e) =>
 {
  //選擇處理
  ProcessIconSelected(item.ImageOptions.Image, item.Description);
 };
}

而對于從系統(tǒng)文件加載文件進行顯示圖標的,類似的觸發(fā)方式。

/// <summary>
  /// 從系統(tǒng)資源中加載圖標文件,然后觸發(fā)事件進行顯示
  /// </summary>
  private void txtFilePath_Properties_ButtonClick(object sender, ButtonPressedEventArgs e)
  {
   string file = GetIconPath();
   if (!string.IsNullOrEmpty(file))
   {
    this.txtFilePath.Text = file;//記錄文件名
    this.txtEmbedIcon.Image = LoadIcon(file);//顯示圖片
    this.txtEmbedIcon.Size = new System.Drawing.Size(64, 64);

    //返回處理
    ProcessIconSelected(this.txtEmbedIcon.Image, file);
   }
  }

這樣我們在菜單的選擇圖標的時候,就可以觸發(fā)事件進行獲取圖表并更新自身了。

Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源

private void btnSelectIcon_Click(object sender, EventArgs e)
  {
   FrmImageGallery dlg = new FrmImageGallery();
   dlg.OnIconSelected += (image, name) =>
   {
    this.txtEmbedIcon.Image = image;
   };
   dlg.ShowDialog();
  }

完成了這些處理,我們再次將焦點放在如何提取并展示DevExpress內(nèi)置圖標的身上。

Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源

為了獲取圖表資源里面的分類及大小等信息,我們需要把圖標資源進行一個加載出來,然后讀取里面的類別和大小、集合等信息。先定義幾個變量來承載這些信息。

/// <summary>
  /// 圖標分類
  /// </summary>
  public List<string> Categories { get; set; }
  /// <summary>
  /// 圖標集合
  /// </summary>
  public List<string> Collection { get; set; }
  /// <summary>
  /// 圖標尺寸
  /// </summary>
  public List<string> Size { get; set; }

我們知道,DevExpress的圖標資源在程序集DevExpress.Utils.DxImageAssemblyUtil.ImageAssembly里面,因此我們需要對它進行讀取,并依次對各個資源進行處理。

我們來看看具體的處理代碼,如下所示。

using (System.Resources.ResourceReader reader = GetResourceReader(DevExpress.Utils.DxImageAssemblyUtil.ImageAssembly))
   {
    System.Collections.IDictionaryEnumerator dict = reader.GetEnumerator();
    while (dict.MoveNext())
    {
     string key = (string)dict.Key as string;
     if (!DevExpress.Utils.DxImageAssemblyUtil.ImageProvider.IsBrowsable(key)) continue;
     if (key.EndsWith(".png", StringComparison.Ordinal))
     {
      string reg = @"(?<collection>\S*?)/(?<category>\S*?)/(?<name>\S*)";
      var collectionItem = CRegex.GetText(key, reg, "collection"); 
      var categoryItem = CRegex.GetText(key, reg, "category");
      string sizeReg = @"_(?<size>\S*)\.";
      var sizeItem = CRegex.GetText(key, sizeReg, "size");

      if (!this.Collection.Contains(collectionItem))
      {
       this.Collection.Add(collectionItem);
      }
      if (!this.Categories.Contains(categoryItem))
      {
       this.Categories.Add(categoryItem);
      }
      if (!this.Size.Contains(sizeItem))
      {
       this.Size.Add(sizeItem);
      }

      Image image = GetImageFromStream((System.IO.Stream)dict.Value);
      if (image != null)
      {
       var item = new DevExpress.XtraBars.Ribbon.GalleryItem(image, key, key);
       if (!ImageCollection.ContainsKey(key))
       {
        ImageCollection.Add(key, item);
       }
      }      
     }
    }
   }

其中讀取資源的操作代碼是

GetResourceReader(DevExpress.Utils.DxImageAssemblyUtil.ImageAssembly)

這個代碼它就是從資源里面進行獲取對應的圖表資源。

private System.Resources.ResourceReader GetResourceReader(System.Reflection.Assembly imagesAssembly)
  {
   var resources = imagesAssembly.GetManifestResourceNames();
   var imageResources = Array.FindAll(resources, resourceName => resourceName.EndsWith(".resources"));
   if (imageResources.Length != 1)
   {
    throw new Exception("讀取異常");
   }
   return new System.Resources.ResourceReader(imagesAssembly.GetManifestResourceStream(imageResources[0]));
  }

另外,我們根據(jù)圖表的文件名結(jié)構,我們通過正則表達式來讀取它的對應信息,然后把它的大小、類別、集合信息存儲起來。

 string reg = @"(?<collection>\S*?)/(?<category>\S*?)/(?<name>\S*)";
 var collectionItem = CRegex.GetText(key, reg, "collection"); 
 var categoryItem = CRegex.GetText(key, reg, "category");
 string sizeReg = @"_(?<size>\S*)\.";
 var sizeItem = CRegex.GetText(key, sizeReg, "size");

圖表信息讀取了,我們需要解析它然后存儲起來,把圖標的Image對象放在一個字典類別里面,方便按照組別進行展示。

Image image = GetImageFromStream((System.IO.Stream)dict.Value);
 if (image != null)
 {
  var item = new DevExpress.XtraBars.Ribbon.GalleryItem(image, key, key);
  if (!ImageCollection.ContainsKey(key))
  {
   ImageCollection.Add(key, item);
  }
 }

有了這些資源,我們對它們進行搜索就顯得很方便了,我們?nèi)绻枰鶕?jù)文件名或者其他條件進行查詢集合的數(shù)據(jù),提供一個通用的方法即可,如下代碼所示。

/// <summary>
  /// 根據(jù)條件獲取集合
  /// </summary>
  /// <returns></returns>
  public Dictionary<string, GalleryItemCollection> Search(List<string> collection, List<string> categories, 
   List<string> size, string fileName = "")
  {
   Dictionary<string, GalleryItemCollection> dict = new Dictionary<string, GalleryItemCollection>();

   GalleryItemCollection list = new GalleryItemCollection();
   foreach (var key in ImageCollection.Keys)
   {
    //使用正則表達式獲取圖標文件名中的集合、類別、大小等信息
    string reg = @"(?<collection>\S*?)/(?<category>\S*?)/(?<name>\S*)";
    var collectionItem = CRegex.GetText(key, reg, "collection");
    var categoryItem = CRegex.GetText(key, reg, "category");
    string sizeReg = @"_(?<size>\S*)\.";
    var sizeItem = CRegex.GetText(key, sizeReg, "size");

    //如果是查詢處理,把記錄放到查詢結(jié)果里面
    if (!string.IsNullOrEmpty(fileName))
    {
     if(key.Contains(fileName))
     {
      list.Add(ImageCollection[key]);
     }
     dict["查詢結(jié)果"] = list;
    }
    else
    {
     //如果是集合和列表中包含的,把它們按類別添加到字典里面
     if (collection.Contains(collectionItem) && 
      categories.Contains(categoryItem) && 
      size.Contains(sizeItem))
     {
      if (!dict.ContainsKey(categoryItem))
      {
       GalleryItemCollection cateList = new GalleryItemCollection();
       cateList.Add(ImageCollection[key]);
       dict[categoryItem] = cateList;
      }
      else
      {
       GalleryItemCollection cateList = dict[categoryItem];
       cateList.Add(ImageCollection[key]);
      }
     }
    }
   }
   return dict;
  }

這次搜索就直接基于已有的集合ImageCollection進行搜索的了,不用再次讀取程序集并依次分析它,速度提供不少的。

由于圖表資源的處理是比較耗時的,我們把整個圖標加載的類作為一個靜態(tài)的對象緩存起來,這樣下次使用直接從緩存里面拿,對應的資源也不用重新加載,更好的提高我們重用的效果了,體驗更好了。

/// <summary>
 /// 圖標庫加載處理
 /// </summary>
 public class DXImageGalleryLoader
 {
  /// <summary>
  /// 圖標字典類別集合
  /// </summary>
  public Dictionary<string, GalleryItem> ImageCollection { get; set; }
  /// <summary>
  /// 圖標分類
  /// </summary>
  public List<string> Categories { get; set; }
  /// <summary>
  /// 圖標集合
  /// </summary>
  public List<string> Collection { get; set; }
  /// <summary>
  /// 圖標尺寸
  /// </summary>
  public List<string> Size { get; set; }

  /// <summary>
  /// 使用緩存處理,獲得對象實例
  /// </summary>
  public static DXImageGalleryLoader Default
  {
   get
   {
    System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod();
    string keyName = string.Format("{0}-{1}", method.DeclaringType.FullName, method.Name);

    var result = MemoryCacheHelper.GetCacheItem<DXImageGalleryLoader>(keyName,
      delegate () { return new DXImageGalleryLoader().LoadData(); },
      new TimeSpan(0, 30, 0));//30分鐘過期
    return result;
   }
  }

以上代碼通過

public static DXImageGalleryLoader Default

定義了一個靜態(tài)的實例屬性,這樣這個DXImageGalleryLoader 實例只會在程序第一次使用的時候構建并加載圖片資源,后續(xù)都是從緩存里面讀取,提高響應速度的同時,也會記住上次的選擇界面內(nèi)容。

以上就是整個功能的處理思路,以及一步步的優(yōu)化處理,以便實現(xiàn)功能展示的同時,也提高響應速度,最終界面就是我們開始的時候介紹的那樣。

Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源

Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源

單擊或者選中系統(tǒng)圖標后, 需要設置的按鈕或者界面,就會及時更新圖標展示,體驗效果還是非常不錯的。

由于這個界面功能的通用性,我把它作為系統(tǒng)界面基礎模塊,放到了我的框架BaseUIDx里面,各個系統(tǒng)模塊都可以調(diào)用了。

關于“Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

分享名稱:Winform開發(fā)框架中怎樣使用DevExpress的內(nèi)置圖標資源
當前網(wǎng)址:http://aaarwkj.com/article32/gooppc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、移動網(wǎng)站建設、小程序開發(fā)、App設計、微信公眾號、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設網(wǎng)站維護公司
曰韩精品一区二区三区乱码| 午夜一区二区精品视频国产| 国产精品六区久久综合亚洲av| 国产av白浆一区二区色爽黄| 久久五十路初次拍五十路| 高清免费国产日日操夜夜草| 亚洲巨人精品福利导航| 精品少妇人妻av蜜桃| 日韩国产传媒在线精品| 欧美黄色一区二区三区视频| 97国产在线视频观看| 免费国产成人高清在线视频| 亚洲精品国产熟女久久| 激情婷婷亚洲五月综合网| 国产日韩一区二区三区电影| 高颜值美女后入内射视频| 亚洲福利一区二区三区| 久久成人午夜免费电影| 国产一区二区黄色在线| 国产成人国产精品国产三级| 日本免费一区二区三区手机在线 | 最新91精品国产自产在线| 久久偷拍女生厕所尿尿| 国内精品自拍亚洲视频| 日本区一区二区三高清视频| 国产丝袜美腿一二三区| 亚洲精品中国一区二区久久 | 四虎最新永久在线网站| 日韩三级成人在线视频| 国产不卡高清视频在线| 国产亚洲一线二线三线| 青青草原在线观看网站| 日本不卡一区二区在线播放| 日本高清视频免费一区| 久久热在线观看免费高清| 亚洲欧美日韩综合精品久久| 亚洲av综合色区一区| 亚洲精品中文字幕码专区| 亚洲一区二区日韩综合久久| 国语对白视频在线观看| 国产精品久久99一区|