资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件

CustomResource

  • ResourceDictionary
  • 加载外部的 ResourceDictionary 文件

示例
1、演示“CustomResource”相关知识点
Resource/CustomResourceTest.cs

/*
 * 本例是一个自定义 CustomXamlResourceLoader,用于演示 CustomResource 的使用
 */

using Windows.UI.Xaml.Resources;

namespace Windows10.Resource
{
    // 如果要在 xaml 中使用 CustomResource,那么需要在 C# 端自定义一个 CustomXamlResourceLoader
    public class CustomResourceTest : CustomXamlResourceLoader
    {
        /// <summary>
        /// 返回 xaml 中的 CustomResource 请求的资源
        /// </summary>
        /// <param name="resourceId">xaml 端的 CustomResource 中的 ResourceKey</param>
        /// <param name="objectType">使用了 CustomResource 的对象类型</param>
        /// <param name="propertyName">使用了 CustomResource 的属性名称</param>
        /// <param name="propertyType">使用了 CustomResource 的属性类型</param>
        /// <returns>返回指定的资源</returns>
        protected override object GetResource(string resourceId, string objectType, string propertyName, string propertyType)
        {
            return $"resourceId: {resourceId}, objectType: {objectType}, propertyName: {propertyName}, propertyType: {propertyType}";
        }
    }
}

Resource/CustomResourceDemo.xaml

<Page
    x:Class="Windows10.Resource.CustomResourceDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Resource"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="10 0 10 10">

            <!--
                下面演示如何使用 CustomResource,相关的自定义资源类参见 CustomResourceTest.cs
            -->
            <TextBlock Margin="5" Text="{CustomResource}" />
            <TextBlock Margin="5" Text="{CustomResource Key1}" />
            <TextBlock Margin="5" Text="{CustomResource Key2}" />

        </StackPanel>
    </Grid>
</Page>

Resource/CustomResourceDemo.xaml.cs

/*
 * 演示“CustomResource”相关知识点
 */

using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Resources;

namespace Windows10.Resource
{
    public sealed partial class CustomResourceDemo : Page
    {
        public CustomResourceDemo()
        {
            // 这是必须的,需要先要指定当前使用的自定义 CustomXamlResourceLoader 实例
            CustomXamlResourceLoader.Current = new CustomResourceTest();

            this.InitializeComponent();
        }
    }
}

2、演示“ResourceDictionary”相关知识点
Resource/ResourceDictionary1.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <!--
        以 ResourceDictionary 为根节点
    -->

    <Color x:Key="ColorRed">#FFFF0000</Color>
    <SolidColorBrush x:Key="BrushRed" Color="{ThemeResource ColorRed}" />

</ResourceDictionary>

Resource/ResourceDictionary2.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <!--
        以 ResourceDictionary 为根节点
    -->

    <Color x:Key="ColorGreen">#FF00FF00</Color>
    <SolidColorBrush x:Key="BrushGreen" Color="{ThemeResource ColorGreen}" />

</ResourceDictionary>

Resource/ResourceDictionary3.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <!--
        以 ResourceDictionary 为根节点
    -->

    <Color x:Key="ColorBlue">#FF0000FF</Color>
    <SolidColorBrush x:Key="BrushBlue" Color="{ThemeResource ColorBlue}" />

</ResourceDictionary>

Resource/ResourceDictionaryDemo.xaml

<Page
    x:Class="Windows10.Resource.ResourceDictionaryDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Resource"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Page.Resources>

        <!--
            FrameworkElement.Resources 就是一个 ResourceDictionary 对象

            1、在 ResourceDictionary 中可以一条一条地定义资源
            2、可以设置 ResourceDictionary 的 Source 属性来引用一个以 ResourceDictionary 为根节点的 xaml 文件
            3、通过 MergedDictionaries 可以集成多个 ResourceDictionary
            4、通过 ThemeDictionaries 可以设置不同主题下的 ResourceDictionary,详见:ThemeResourceDemo.xaml
        -->

        <ResourceDictionary>

            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="ResourceDictionary1.xaml" />
                <ResourceDictionary Source="ms-appx:///Resource/ResourceDictionary2.xaml" />
            </ResourceDictionary.MergedDictionaries>

            <Color x:Key="ColorOrange">#FFFFA500</Color>
            <SolidColorBrush x:Key="BrushOrange" Color="{ThemeResource ColorOrange}" />

        </ResourceDictionary>

    </Page.Resources>

    <Grid Background="Transparent">
        <StackPanel Margin="10 0 10 10">

            <TextBlock Name="textBlock1" Margin="5" Text="我是 TextBlock" Foreground="{StaticResource BrushRed}" />
            <TextBlock Name="textBlock2" Margin="5" Text="我是 TextBlock" Foreground="{StaticResource BrushGreen}" />
            <TextBlock Name="textBlock3" Margin="5" Text="我是 TextBlock" Foreground="{StaticResource BrushOrange}" />

            <!--
                演示如何通过 C# 端引入新的 ResourceDictionary 并使用其中的资源
            -->
            <TextBlock Name="textBlock4" Margin="5" Text="我是 TextBlock" />

            <!--
                演示如何获取指定资源的值
            -->
            <TextBlock Name="lblMsg" Margin="5" TextWrapping="Wrap" />
            <Button Name="btnGetResourceValue" Margin="5" Content="获取指定资源的值" Click="btnGetResourceValue_Click" />

        </StackPanel>
    </Grid>
</Page>

Resource/ResourceDictionaryDemo.xaml.cs

/*
 * 演示“ResourceDictionary”相关知识点
 */

using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;

namespace Windows10.Resource
{
    public sealed partial class ResourceDictionaryDemo : Page
    {
        public ResourceDictionaryDemo()
        {
            this.InitializeComponent();

            this.Loaded += ResourceDictionaryDemo_Loaded;
        }

        private void ResourceDictionaryDemo_Loaded(object sender, RoutedEventArgs e)
        {
            // 实例化一个 ResourceDictionary
            ResourceDictionary rd = new ResourceDictionary
            {
                Source = new Uri("ms-appx:///Resource/ResourceDictionary3.xaml", UriKind.Absolute)
            };

            // 将指定的 ResourceDictionary 集成到 Page.Resources 内的资源字典中
            this.Resources.MergedDictionaries.Add(rd);

            // 使用上面集成进来的资源字典中的资源
            textBlock4.Foreground = (SolidColorBrush)this.Resources["BrushBlue"];

            /*
             * 上面的例子演示的是如何处理指定的 FrameworkElement 中的资源
             * 如果需要处理 application 级的资源的话,可以通过 Application.Current.Resources 来获取 application 级的资源(对应的 xaml 为 App.xaml)
             */
        }

        private void btnGetResourceValue_Click(object sender, RoutedEventArgs e)
        {
            // 获取 application 级的指定资源的值
            lblMsg.Text = "SystemAccentColor: " + Application.Current.Resources["SystemAccentColor"].ToString();
            lblMsg.Text += Environment.NewLine;

            // 获取指定 ResourceDictionary 中的指定资源的值
            lblMsg.Text += "Page.Resources 中的 ColorRed 的值: " + this.Resources["ColorRed"].ToString();
            lblMsg.Text += Environment.NewLine;

            // 获取指定 ResourceDictionary 中的指定资源的值
            ResourceDictionary resourceDictionary1 = this.Resources.MergedDictionaries[0];
            lblMsg.Text += "Page.Resources.MergedDictionaries[0] 中的 ColorRed 的值: " + resourceDictionary1["ColorRed"].ToString();
        }
    }
}

3、演示如何加载并使用外部的 ResourceDictionary
Resource/RemoteResource.xaml

<Page
    x:Class="Windows10.Resource.RemoteResource"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Resource"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Page.Resources>

        <Color x:Key="ColorOrange">#FFFFA500</Color>
        <SolidColorBrush x:Key="BrushOrange" Color="{ThemeResource ColorOrange}" />

    </Page.Resources>

    <Grid Background="Transparent">
        <StackPanel Margin="10 0 10 10">

            <TextBlock Name="textBlock" Margin="5" Text="我是 TextBlock" Foreground="{StaticResource BrushOrange}" />

            <!--
                加载并使用远程 ResourceDictionary 中的资源
            -->
            <Button Name="btnLoadRemoteResource" Content="加载并使用远程 ResourceDictionary 中的资源" Margin="5" Click="btnLoadRemoteResource_Click" />

        </StackPanel>
    </Grid>
</Page>

Resource/RemoteResource.xaml.cs

/*
 * 演示如何加载并使用外部的 ResourceDictionary
 */

using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Markup;
using Windows.UI.Xaml.Media;
using Windows.Web.Http;

namespace Windows10.Resource
{
    public sealed partial class RemoteResource : Page
    {
        // 需要加载的 ResourceDictionary 的 http 地址
        string resourceDictionaryUrl = "http://localhost:44914/xaml/ResourceDictionary.txt";

        public RemoteResource()
        {
            this.InitializeComponent();
        }

        private async void btnLoadRemoteResource_Click(object sender, RoutedEventArgs e)
        {
            // 下载远程的 ResourceDictionary 文件
            HttpClient client = new HttpClient();
            string resourceDictionaryString = await client.GetStringAsync(new Uri(resourceDictionaryUrl, UriKind.Absolute));

            // 将字符串转换为 ResourceDictionary 对象
            ResourceDictionary resourceDictionary = XamlReader.Load(resourceDictionaryString) as ResourceDictionary;

            // 将指定的 ResourceDictionary 集成到 Page.Resources 内的资源字典中
            this.Resources.MergedDictionaries.Add(resourceDictionary);

            // 使用远程 ResourceDictionary 中的资源
            textBlock.Foreground = (SolidColorBrush)this.Resources["BrushGreen"];
        }
    }
}

http://localhost:44914/xaml/ResourceDictionary.txt

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Color x:Key="ColorGreen">#FF00FF00</Color>
    <SolidColorBrush x:Key="BrushGreen" Color="{ThemeResource ColorGreen}" />

</ResourceDictionary>
时间: 2024-10-14 16:42:22

资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件的相关文章

背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 资源 CustomResource ResourceDictionary 加载外部的 ResourceDictionary 文件 示例1.演示“CustomResource”相关知识点CustomResourceTest.cs /* * 本例是一个自定义 CustomXamlResourceLoader,用于演示 CustomResource 的使用 */ using Windows.UI.Xaml.Resources;

如何点击按钮后在加载外部的Js文件

或许有朋友遇到过,想等自己点击按钮之后才执行某一个js文件,那么,你运气好,看到了我的代码了哈哈, <html> <head> <title></title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js" type="text/javascript"></script> <scri

使用js加载器动态加载外部Javascript文件

今天在网上找到了一个可以动态加载js文件的js加载器,具体代码如下: JsLoader.js 1 var MiniSite=new Object(); 2 /** 3 * 判断浏览器 4 */ 5 MiniSite.Browser={ 6 ie:/msie/.test(window.navigator.userAgent.toLowerCase()), 7 moz:/gecko/.test(window.navigator.userAgent.toLowerCase()), 8 opera:/o

转载:Flash AS3.0 加载外部资源(图片,MP3,SWF)的两种方式

Flash AS3.0 加载外部资源(图片,MP3,SWF)的两种方式 出自:http://www.cnblogs.com/top5/archive/2012/08/04/2623464.html 关于AS3加载图片等外部资源,我常用的有两种方式:Loader和Embed,各自的特点,总结如下: Embed:在Flash编译阶段就将资源嵌入,也就是说图片资源是会被编译进swf文件里面去的:这样子的好处是代码比较简洁,使用方便,也不存在加载顺序的问题,缺点是会增大swf文件的体积 Loader:在

iframe 加载外部资源,显示隐藏loading,onload失效

在项目中使用iframe 来加载外部资源,需要在iframe请求外部资源的时候,需要显示一个loading,在加载完成后,将这个loading隐藏掉,刚开始看到W3C中 iframe有一个 onload事件----该事件在iframe加载资源完成后就会触发,但是这个事件我试了试,发现触发不了,最在https://stackoverflow.com/questions/20572734/load-event-not-firing-when-iframe-is-loaded-in-chrome找到了

u3d外部资源 打包与加载的问题

被坑了一下午,调bug,u3d外部加载资源一会可以,一会不行,始终找不到问题,最后快下班的时候,重新试了一下,原来是资源打包之前的文件名,和之后的加载资源名必须一样 [MenuItem("Custom Editor/Build AssetBundle From Selection Twice")] static void ExportResourceNoTrack() { // Bring up save panel string path = EditorUtility.SaveFi

ActionScript 3.0 加载外部SWF素材资源MovieClip,SimpleButton不支持鼠标事件

我们用flash buidler加载素材一般有三种途径: 1.SWC,这种方式会增大SWF的大小 2.flash cs项目关联 3.SWF专门放素材资源通过Loader方式加载 今天发现通过SWF加载方式有个问题要加载的素材如下图: A:是一个MC,里面放了一个B:mc,C:SimpleButton 问题:加载进A后对A添加鼠标事件如CLICK事件,单击B或C时没有反映? 开始我的加载方式是这样的: 目录结构如图: 代码如下: 1 package 2 { 3 import flash.displ

PhoneGap 白名单安全机制 navigator.app 加载外部页面返回以及退出介绍

一. Phonegap 白名单安全机制 Phonegap应用的页面大多存在于本地,但有时需要加载外部的Web页面到应用内置的浏览器 视图中已完成特定的应用功能,出于安全性考虑,PhoneGap 设立了白名单安全机制,通过它来 控制能够加载到内置浏览器视图的内容来源. Android 不通过白名单安全机制的话调用外部浏览器 IOS 不通过白名单安全的话 会直接拒绝 二.Android 配置白名单 在res/xml/config.xml这个文件里进行配置 三.IOS 配置 以及 Wp7/wp8配置白

资源:创建 加载 存储 使用 ---- 热更新

Unity中资源动态加载的几种方式比较 http://blog.csdn.net/leonwei/article/details/18406103 Unity 加载外部资源 http://www.360doc.com/content/14/0323/13/12282510_363016241.shtml