最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c# wpf如何更好的使用Application程序集資源

 更新時(shí)間:2021年04月07日 11:40:01   作者:杜文龍  
這篇文章主要介紹了c# wpf如何更好的使用Application程序集資源,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下

  這一篇單獨(dú)拿出來分析這個(gè)程序集資源,為的就是不想讓大家把程序集資源和exe程序強(qiáng)關(guān)聯(lián),因?yàn)槌绦蚣Y源實(shí)際上是二進(jìn)制資源,后續(xù)編譯過程中會被嵌入到程序集中,而為了更方便的使用資源,我們要好好梳理一下程序集資源相關(guān)的知識。(例如多語言資源,多工程、多項(xiàng)目使用的公共資源文件)。

1)在程序集中添加資源

我們通過向項(xiàng)目添加文件并嘗試修改資源文件屬性看有什么不同的結(jié)果。

在工程上右鍵=》添加=》新建文件夾=》改名為Images=》回車=》在Images文件夾上右鍵=》添加=》現(xiàn)有項(xiàng)=》右下角文件類別選擇所有文件=》找到你想導(dǎo)入的圖片=》點(diǎn)擊添加,結(jié)果如下圖.

這樣就添加好了一個(gè)文件,我們在添加的圖片上右鍵屬性看到生成操作為Resource,我們添加代碼如下:

<Window x:Class="ApplicationResources.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:local="clr-namespace:ApplicationResources"
  mc:Ignorable="d"
  Title="MainWindow" Height="450" Width="800">
 <Grid>
  <Image Source="/Images/takenotes.png" Width="230" Height="130"/> 
 </Grid>
</Window>

我們在工程上點(diǎn)擊編譯,生成成功后我們?nèi)タ淳幾g結(jié)果,發(fā)現(xiàn)文件夾下沒有這個(gè)image,我們使用反編譯ILSpy工具查看生成的這個(gè)exe,我們看到Png文件作為資源被放在了resources里,(這里有一個(gè)小插曲,不知道為什么,我的PNG圖片在最開始反編譯的時(shí)候沒有。直到我添加了上面Image的代碼反編譯才出來。以后會分析這個(gè)問題。這里記錄一下)

而修改圖片的屬性為Content并修改復(fù)制到輸出目錄為始終復(fù)制。重新編譯工程。

我們看到了Debug文件夾下多了一個(gè)Images文件夾,里面包含了我們的圖片。而反編譯程序集集中就沒有這個(gè)資源文件了,它從資源里更換到目錄下了。這樣的話,程序集因?yàn)闆]有包含了資源文件大小就發(fā)生了變化。

通過修改資源的屬性,資源在編譯過程中會放置在不同的地方,這是其中2種比較常用的設(shè)置屬性。通過這種設(shè)置程序集資源的方式易于更新,只需要在桌面資源管理器種替換掉文件并重新編譯程序就能完成資源文件的替換,非常方便。資源文件可以放在主工程文件下,也可以選擇放在單獨(dú)的DLL下,具體看你的設(shè)計(jì)需要啦。因?yàn)榻酉聛砦覀儠敿?xì)講如何讀取這些資源。即使跨了DLL。

2)在程序集中查找資源

  因?yàn)槭窃谥vApplication的資源所以我們先看Application下對資源的查找方法,在App.xaml的Application上按下F12:

我們看到了返回StreamResourceInfo類型的方法又3個(gè)。GetContentStream()、GetRemoteStream()、GetResourceStream()。這里只講GetResourceStream()其他的可以自己在對應(yīng)的方法上按F1查看文檔。(記得把資源屬性設(shè)置成Resouce)

我們使用這種在程序集管理所有資源的方式,我們可以自己實(shí)現(xiàn)很多種自己管理資源的想法??梢园汛a添加到自己的工程里調(diào)試一下看看自己感興趣的內(nèi)容,代碼如下:

using System;
using System.Collections;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Resources;
using System.Windows;
using System.Windows.Resources;

namespace ApplicationResources
{
 /// <summary>
 /// MainWindow.xaml 的交互邏輯
 /// </summary>
 public partial class MainWindow : Window
 {
  public MainWindow()
  {
   InitializeComponent();
   //方法1使用StreamResourceInfo接收GetResourceStream()讀取到的內(nèi)容。
   StreamResourceInfo sri = Application.GetResourceStream(new Uri("Images/takenotes.png", UriKind.Relative));
   string type = sri.ContentType;
   var stream = sri.Stream;
   //方法2,還記得我們反編譯時(shí)候看到的資源嗎?從Assembly取我們要的資源。
   Assembly assembly = Assembly.GetAssembly(this.GetType());
   string resourceName = assembly.GetName().Name + ".g";
   //單個(gè)資源
   ResourceManager rm = new ResourceManager(resourceName, assembly); 
    using (ResourceSet set = rm.GetResourceSet(CultureInfo.CurrentCulture, true, true))
    {
     UnmanagedMemoryStream s = (UnmanagedMemoryStream)set.GetObject("Images/takenotes.png", true);
    }
   //遍歷所有資源
   ResourceManager rmResources = new ResourceManager(resourceName, assembly);
   using (ResourceSet set = rmResources.GetResourceSet(CultureInfo.CurrentCulture, true, true))
   {
    foreach (DictionaryEntry item in set)
    {
     Debug.WriteLine($"ResourceSet DictionaryEntry as {item.Key.ToString()}");
    }
   }

  }
 }
}

WPF目前給我們封裝了一些訪問資源的方法,我們使用XAML和CS下傳入相對和絕對路徑來演示:

<Window x:Class="ApplicationResources.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:local="clr-namespace:ApplicationResources"
  mc:Ignorable="d" Loaded="Window_Loaded"
  Title="MainWindow" Height="450" Width="800">
 <Grid>
  <StackPanel> 
  <Image Source="Images/takenotes.png" Width="220" VerticalAlignment="Top" HorizontalAlignment="Left"/>
  <Image Source="d:\Image\takenotes.png" Width="220" VerticalAlignment="Top" HorizontalAlignment="Left"/>
   <Image x:Name="imgAbsolutePath" Width="220" VerticalAlignment="Top" HorizontalAlignment="Left"/>
   <Image x:Name="imgRelativePath" Width="220" VerticalAlignment="Top" HorizontalAlignment="Left"/>
  </StackPanel>
 </Grid>
</Window>
 private void Window_Loaded(object sender, RoutedEventArgs e)
  {
   imgAbsolutePath.Source = new BitmapImage(new Uri(@"d:\Image\takenotes.png", UriKind.Absolute));
   imgRelativePath.Source = new BitmapImage(new Uri("Images/takenotes.png",UriKind.Relative)); 
  }

在這個(gè)基礎(chǔ)上WPF支持pack URI。pack URI語法可以尋址包含在編譯過的程序中的資源,(從名字上理解package URI?)使用pack URI可以讓我們更加規(guī)范的使用資源文件,也更加方便。

如下這2段代碼是等效的因?yàn)闆]有跨程序集。

 <Image Source="Images/takenotes.png" Width="220" VerticalAlignment="Top" HorizontalAlignment="Left"/>
 <Image Source="pack://application:,,,/Images/takenotes.png" Width="220" VerticalAlignment="Top" HorizontalAlignment="Left"/>

我新建了一個(gè)程序集,放置在ImageLibrary程序集下同樣目錄的資源。

Xaml寫法:

   <Image Source="Images/takenotes.png" Width="120" VerticalAlignment="Top" HorizontalAlignment="Left"/>
   <Image Source="pack://application:,,,/Images/takenotes.png" Width="120" VerticalAlignment="Top" HorizontalAlignment="Left"/> 
   <Image Source="pack://application:,,,/ImageLibrary;component/Images/takenotes.png" Width="120" VerticalAlignment="Top" HorizontalAlignment="Left"/> 

CS寫法:

private void Window_Loaded(object sender, RoutedEventArgs e)
  {
   //絕對路徑
   imgAbsolutePath.Source = new BitmapImage(new Uri(@"d:\Image\takenotes.png", UriKind.Absolute));
   //相對路徑
   imgRelativePath.Source = new BitmapImage(new Uri("Images/takenotes.png",UriKind.Relative));
   //當(dāng)前程序集pack URI 語法
   imgRelativePath.Source = new BitmapImage(new Uri("pack://application:,,,/Images/takenotes.png"));
   //跨程序集使用資源 pack URI 語法
   imgCrossAssemblyPath.Source = new BitmapImage(new Uri("pack://application:,,,/ImageLibrary;component/Images/takenotes.png")); 
  }

這樣就可以把資源單獨(dú)存放在一個(gè)DLL里。然后剩下的就看自己怎么使用拉。

我們主工程下一般會保持當(dāng)前App.xaml的當(dāng)前資源結(jié)構(gòu)。我們把資源都放在 Application.Current.Resources.MergedDictionaries內(nèi)。通過MergedDictionaries更好的動態(tài)替換同類型的資源(比如多語言的一種實(shí)現(xiàn)方式)。

var targetResource = Application.Current.Resources.MergedDictionaries.FirstOrDefault(x => x.Source != null && x.Source.OriginalString.Contains(uri));
 if (targetResource != null)
 {
   Application.Current.Resources.MergedDictionaries.Remove(targetResource);
 }
 //添加與系統(tǒng)語言對應(yīng)的語言包
 Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary
 {
  Source = new Uri($"pack://application:,,,/ApplicationResources;component/Lang/{rcName}.xaml", UriKind.RelativeOrAbsolute)
 });

這樣的話,就能輔助我們更好的使用資源拉,是不是發(fā)現(xiàn)寫代碼如果保持正確的解耦,寫代碼會就越來越簡單?

以上就是c# wpf如何更好的使用Application程序集資源的詳細(xì)內(nèi)容,更多關(guān)于wpf使用Application程序集資源的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c# 實(shí)現(xiàn)網(wǎng)頁加載后將頁面截取為長圖片

    c# 實(shí)現(xiàn)網(wǎng)頁加載后將頁面截取為長圖片

    這篇文章主要介紹了c# 實(shí)現(xiàn)網(wǎng)頁加載后將頁面截取為長圖片的方法,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2021-01-01
  • C#基礎(chǔ)概念二十五問 16-20

    C#基礎(chǔ)概念二十五問 16-20

    C#基礎(chǔ)概念二十五問 16-20...
    2007-04-04
  • C# Char結(jié)構(gòu)中IsLetterOrDigit(Char)的方法詳解

    C# Char結(jié)構(gòu)中IsLetterOrDigit(Char)的方法詳解

    這篇文章給大家介紹了C#的Char 結(jié)構(gòu)的IsLetterOrDigit(Char)的方法,并通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • WPF利用TextBlock實(shí)現(xiàn)查找結(jié)果高亮顯示效果

    WPF利用TextBlock實(shí)現(xiàn)查找結(jié)果高亮顯示效果

    在應(yīng)用開發(fā)過程中,經(jīng)常遇到這樣的需求:通過關(guān)鍵字查找數(shù)據(jù),把帶有關(guān)鍵字的數(shù)據(jù)顯示出來,同時(shí)在結(jié)果中高亮顯示關(guān)鍵字,所以本文就來和大家介紹一下如何利用TextBlock實(shí)現(xiàn)查找結(jié)果高亮顯示效果吧
    2023-08-08
  • C# 屏蔽關(guān)鍵字的實(shí)現(xiàn)方法

    C# 屏蔽關(guān)鍵字的實(shí)現(xiàn)方法

    前段時(shí)間在公司做了一個(gè)論壇屏蔽關(guān)鍵字的功能,我做的比較簡單、實(shí)用~ 現(xiàn)在拿出來給博友們分享下..也希望大家能頂頂我~
    2013-05-05
  • C#連接Oracle數(shù)據(jù)庫字符串(引入DLL)的方式

    C#連接Oracle數(shù)據(jù)庫字符串(引入DLL)的方式

    這篇文章主要給大家介紹了關(guān)于C#連接Oracle數(shù)據(jù)庫字符串(引入DLL)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • C#讀取本地網(wǎng)絡(luò)配置信息的方法小結(jié)

    C#讀取本地網(wǎng)絡(luò)配置信息的方法小結(jié)

    在現(xiàn)代軟件開發(fā)中,處理網(wǎng)絡(luò)配置信息是一個(gè)常見需求,無論是開發(fā)桌面、移動還是服務(wù)器應(yīng)用程序,了解如何在C#中讀取和管理網(wǎng)絡(luò)配置信息都是非常有用的,本文將探討在C#中讀取本地網(wǎng)絡(luò)配置信息的方法,并提供幾個(gè)實(shí)際應(yīng)用場景的示例,需要的朋友可以參考下
    2024-10-10
  • C#實(shí)現(xiàn)任務(wù)欄通知窗口

    C#實(shí)現(xiàn)任務(wù)欄通知窗口

    作為程序員在享受的同時(shí)我們也不禁要問:這到底是怎么實(shí)現(xiàn)的呢?本文就利用Visual Studio .Net C# 2005以及.Net框架繪圖技術(shù)來實(shí)現(xiàn)這種任務(wù)欄通知窗口。
    2015-10-10
  • C#多線程開發(fā)之任務(wù)并行庫詳解

    C#多線程開發(fā)之任務(wù)并行庫詳解

    最近在學(xué)習(xí)C#的并行編程,在每本書上的看到的知識點(diǎn)都不全面,所以先參考多本書書籍的講解,將并行編程,多線程編程的知識點(diǎn)整理一下,這篇文章主要給大家介紹了關(guān)于C#多線程開發(fā)之任務(wù)并行庫的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • C# Chart折線圖使用鼠標(biāo)滾輪放大、縮小和平移曲線方式

    C# Chart折線圖使用鼠標(biāo)滾輪放大、縮小和平移曲線方式

    這篇文章主要介紹了C# Chart折線圖使用鼠標(biāo)滾輪放大、縮小和平移曲線方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論

旬邑县| 托克托县| 正蓝旗| 扎鲁特旗| 保靖县| 鹿邑县| 嘉鱼县| 海淀区| 淳安县| 榕江县| 漯河市| 大田县| 延川县| 福泉市| 五寨县| 吉安县| 嵩明县| 隆林| 江安县| 东乡| 新蔡县| 中山市| 大姚县| 克拉玛依市| 鄱阳县| 茶陵县| 静海县| 永清县| 都匀市| 大悟县| 高唐县| 三门峡市| 绩溪县| 邯郸市| 龙陵县| 太康县| 福清市| 遵义县| 安庆市| 府谷县| 南充市|