WPF如何获取和设置应用程序范围的资源

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF如何获取和设置应用程序范围的资源相关的知识,希望对你有一定的参考价值。

存储在 Resources 中的资源可以从在应用程序的 Application 对象 范围内执行的任何代码(即,可访问 Current 的代码)中获得。 另外,还可在资源查找路径中使用 Resources。 Resources 是从标记和代码中都可以设置的键/值对字典,如下所示:// Set an application-scope resource
Application.Current.Resources["ApplicationScopeResource"] =
Brushes.White; XAML:
使用代码获取资源: Brush whiteBrush = (Brush)Application.Current.Resources["ApplicationScopeResource"]; 当使用 Resources 时有两个注意事项。 首先,字典的 键 是一个对象,因此设置和获取属性值时需要准确使用相同的对象实例(请注意:使用字符串键时该键区分大小写)。 其次,字典的 值 是一个对象,因此获取属性值时需要将该值转换成需要的类型。
参考技术A   从msdn上免费下载使用。
  WPF 为Windows Presentation Foundation的首字母缩写(原来代号为"Avalon"),由 .NET Framework 3.0 (曾用名WinFX)开始引入,与 Windows CommunicationFoundation(WCF)及 Windows Workflow Foundation(WWF)并行为新一代 Windows操作系统以及 WinFX 的三个重大应用程序开发类库。
  WPF是微软新一代图形系统,运行在.NET Framework 3.0及以上版本,为用户界面、2D/3D 图形、文档和媒体提供了统一的描述和操作方法。基于DirectX 9/10技术(由C++编程语言实现,遵循COM)的WPF不仅带来了前所未有的3D界面,而且其图形向量渲染引擎也大大改进了传统的2D界面,比如Vista(Windows Vista个人桌面操作系统)中的半透明效果的窗体等都得WPF益于WPF。程序员在WPF的帮助下,要开发出媲美Mac程序的酷炫界面已不再是遥不可及的奢望。 WPF相对于Windows客户端的开发来说,向前跨出了巨大的一步,它提供了超丰富的.NET UI(如asp.net UI) 框架,集成了矢量图形,丰富的流动文字支持(flow text support),3D视觉效果和强大无比的控件模型框架。
  目前WPF的最新版本为4.5(对应.net framework 4.5),支持Windows 7 (x86 和 x64)、WindowsServer 2008、WindowsServer 2008 R2、Windows VistaSP2(x86 和 x64)、Windows 8 (x86 和 x64)、Windows Server 2008 R2 (x64)、Windows Server 2008(x86 和 x64)、WindowsServer 2008 R2 核心 SP1、Windows Server 2012 x86 和 x64系统,开发人员可以从msdn上免费下载。

WPF 如何找到资源文件路径包含 # 号的文件

本文告诉大家如何在 WPF 获取资源文件包含 # 号的文件资源

我遇到一个有意思的设计师小伙伴,他的文件命名喜欢使用 #数字 的方式命名,例如写一个图片文件,他的命名是 Image#1.pngImage#2.png 的格式

如果在 WPF 中拖入的图片,通过属性设置作为资源,默认是可以在 XAML 里面进行引用,使用相对或绝对路径引用,如下面代码

  <Grid>
    <Image x:Name="Image" Width="200" Height="200" Stretch="Fill" Source="lindexidoubi.png" />
  </Grid>

以上代码需要在解决方案里面放一个 lindexidoubi.png 文件,同时设置属性生成作为资源,可以在 csproj 上看到代码如下

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

  <ItemGroup>
    <Resource Include="lindexidoubi.png" />
  </ItemGroup>

</Project>

在后台代码可以使用如下代码获取

 var streamResourceInfo = Application.GetResourceStream(new Uri("lindexidoubi.png", UriKind.Relative));

看起来这样的代码清真,但是我遇到的设计师给了我一堆图片,这些图片的命名都有 # 号

于是我更换了 xaml 的代码如下

  <Grid>
    <Image x:Name="Image" Width="200" Height="200" Stretch="Fill" Source="lindexi#doubi.png" />
  </Grid>

运行时将不会有任何显示,在 Loaded 事件里面尝试获取图片的 Source 拿到的是空

        public MainWindow()
        {
            InitializeComponent();

            Loaded += MainWindow_Loaded;
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            var imageSource = Image.Source;
        }

而通过后台代码,如下面代码获取将提示找不到文件

            var streamResourceInfo = Application.GetResourceStream(new Uri("lindexi#doubi.png", UriKind.Relative));

提示的内容如下

System.IO.IOException:“找不到资源“lindexi”。”

可以看到,传入的是 lindexi#doubi.png 但忽略了 # 后面的内容。这是因为 Uri 转义的问题,需要使用如下代码才能拿到

 var streamResourceInfo = Application.GetResourceStream(new Uri(Uri.EscapeDataString("lindexi#doubi.png"), UriKind.Relative));

同理,需要在 XAML 将 # 转义,通过 Uri.EscapeDataString 可以了解到 # 可以的转义如下

  <Grid>
    <Image x:Name="Image" Width="200" Height="200" Stretch="Fill" Source="lindexi%23doubi.png" />
  </Grid>

于是我就不用和设计师打起来了

在 WPF 中是支持资源的文件路径名包含了 # 号的,但是在使用的时候需要进行转义,通过 Uri 的 EscapeDataString 方法而不是 EscapeUriString 方法进行转换才能拿到资源

本文上面代码放在 githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 9b8e547f21e4a36d4c5aafec87e08d0ef4bcacb5

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git

获取代码之后,进入 CarqawlawyofuwairfuJalbeewhaidearheebee 文件夹

我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

如有不方便在博客评论的问题,可以加我 QQ 2844808902 交流

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

以上是关于WPF如何获取和设置应用程序范围的资源的主要内容,如果未能解决你的问题,请参考以下文章

如何获取响应头信息

WPF 如何找到资源文件路径包含 # 号的文件

wpf 如何获取textbox 里按钮的点击事件

如何获取高级电源设置的值

WPF:在代码隐藏中引用应用程序范围的资源

如何在 MVVM-WPF 中获取所选项目