zoukankan      html  css  js  c++  java
  • 背水一战 Windows 10 (11)

    [源码下载]


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



    作者:webabcd


    介绍
    背水一战 Windows 10 之 资源

    • 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>



    OK
    [源码下载]

  • 相关阅读:
    第七章11
    第七章10
    第七章9
    第七章8
    第七章7
    第七章6
    第七章5
    第七章例7-13
    第七章例7-12
    第七章例7-11
  • 原文地址:https://www.cnblogs.com/webabcd/p/5496998.html
Copyright © 2011-2022 走看看