WPF 在后台代码定义 ResourceDictionary 资源字典

在 WPF 中的 ResourceDictionary 资源字典大部分都是在 XAML 里面定义的,但是在 C# 代码定义一个资源字典也是可行的,只是写起来有点诡异

在 CSharp 后台代码里面给 WPF 定义资源字典需要重新创建一个类,让这个类继承 ResourceDictionary 如以下代码

    public class Foo : ResourceDictionary
    {

    }

然后在构造函数里面加入测试的代码,添加一个颜色作为资源

    public class Foo : ResourceDictionary
    {
        public Foo()
        {
            Add("Foo", Brushes.Gray);
        }
    }

在后台代码添加的资源需要在被加入到使用之前,完成资源的添加,因此建议写在构造函数里面

使用这个在后台代码定义的资源字典有两个方法,一个是在 XAML 引用,另一个是在后台代码添加

在 XAML 引用的逻辑如下

    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <local:Foo></local:Foo>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>

    <Grid Background="{StaticResource Foo}">

    </Grid>

需要注意的是在 C# 后台定义的 WPF 资源字典不能通过 Url 的方式引用,而是需要通过实例的方式。可以选择创建实例或引用资源的方式,如上面代码是创建实例

在上面代码定义了一个测试使用的代码,尝试使用 StaticResource Foo 静态资源,这个静态资源是定义在后台代码的资源字典的,运行代码可以看到能绑定上

而在后台代码添加引用的方法如下

    Resources.MergedDictionaries.Add(new Foo());

这就是在后台定义资源字典的用法了

在后台代码定义资源字典还有一个有趣的黑科技是重新返回资源的值

大概代码逻辑如下

    public class Foo : ResourceDictionary
    {
        public Foo()
        {
            Add("Foo", Brushes.Gray);
        }

        protected override void OnGettingValue(object key, ref object value, out bool canCache)
        {
            value = Brushes.Blue;
            canCache = true;
        }
    }

在这个资源字典里面定义了 Foo 是灰色,但是在 OnGettingValue 方法里面返回的是蓝色。因此在 XAML 里面绑定静态资源的时候,将会显示的实际颜色是蓝色

另外只要资源里面的值不是 null 空,那么都会进入 OnGettingValue 方法去读取实际返回的值,而实际返回值是 object 类型,意味着可以愉快更改返回类型

        public Foo()
        {
            Add("Foo", null); // 传入 null 将不会进入 OnGettingValue 方法
        }

        protected override void OnGettingValue(object key, ref object value, out bool canCache)
        {
            value = Brushes.Blue;
            canCache = true;
        }

如以下代码,传入的是 object 但是在 OnGettingValue 方法可以返回颜色

        public Foo()
        {
            Add("Foo", new object());
        }

        protected override void OnGettingValue(object key, ref object value, out bool canCache)
        {
            value = Brushes.Blue;
            canCache = true;
        }

利用这个有趣的科技也可以用来做多语言或者主题色等,只是这个方法没有自动的更新值机制

本文代码放在github欢迎小伙伴访问

而在 XAML 定义内容,同时支持对应的后台代码也可以,但是没有什么意义,至少我还不知道这个功能有什么作用

做法就是和上面代码一样,定义一个继承 ResourceDictionary 的类,如下面代码

    public class ResourceJainahijainenelHuceenukur : ResourceDictionary
    {
        public ResourceJainahijainenelHuceenukur()
        {
            Debugger.Break();
        }

        protected override void OnGettingValue(object key, ref object value, out bool canCache)
        {
            Debugger.Break();
            base.OnGettingValue(key, ref value, out canCache);
        }
    }

接着创建一个资源字典,创建之后修改 ResourceDictionary 为刚才创建的类名

 <local:ResourceJainahijainenelHuceenukur xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                           xmlns:local="clr-namespace:KemkicemdurFemceloja">
    <SolidColorBrush x:Key="Foo" Color="Aquamarine"></SolidColorBrush>
</local:ResourceJainahijainenelHuceenukur>

此时就完成了,依然使用的时候使用 url 的形式

但是这样做我想不到有多少意义,因为 OnGettingValue 方法尽管重写了,但是实际不会被调用进入

本文代码放在github欢迎小伙伴访问

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

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

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

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

lindexi_gd CSDN认证博客专家 C# WPF UWP 微软最具价值专家
我是微软Windows应用开发方向的最具价值专家,欢迎访问我博客blog.lindexi.com里面有大量WPF和UWP博客
相关推荐
<p> 课程演示环境:Windows10  </p> <p> 需要学习<span>Ubuntus</span>系统<span>YOLOv4-tiny</span>的同学请前往《<span>YOLOv4-tiny</span>目标检测实战:训练自己的数据集》 <span></span> </p> <p> <span> </span> </p> <p> <span style="color:#E53333;">YOLOv4-tiny</span><span style="color:#E53333;">来了!速度大幅提升!</span><span></span> </p> <p> <span> </span> </p> <p> <span>YOLOv4-tiny</span><span>COCO</span>上的性能可达到:<span>40.2% AP50, 371 FPS (GTX 1080 Ti)</span>。相较于<span>YOLOv3-tiny</span>,<span>AP</span>和<span>FPS</span>的性能有巨大提升。并且,<span>YOLOv4-tiny</span>的权重文件只有<span>23MB</span>,适合移动端、嵌入式设备、边缘计算设备上部署。<span></span> </p> <p> <span> </span> </p> <p> 本课程将手把手地教大家使用<span>labelImg</span>标注和使用<span>YOLOv4-tiny</span>训练自己的数据集。课程实战分为两个项目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测)。<span></span> </p> <p> <span> </span> </p> <p> 本课程的<span>YOLOv4-tiny</span>使用<span>AlexAB/darknet</span>,<span>Windows10</span>系统上做项目演示。包括:<span>YOLOv4-tiny</span>的网络结构、安装<span>YOLOv4-tiny</span>、标注自己的数据集、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计<span>(mAP</span>计算<span>)</span>和先验框聚类分析。 <span> </span> </p> <p> <span> </span> </p> <p> 除本课程《<span>Windows</span>版<span>YOLOv4-tiny</span>目标检测实战:训练自己的数据集》外,本人推出了有关<span>YOLOv4</span>目标检测的系列课程。请持续关注该系列的其它视频课程,包括:<span></span> </p> <p> 《<span>Windows</span>版<span>YOLOv4</span>目标检测实战:训练自己的数据集》<span></span> </p> <p> 《<span>Windows</span>版<span>YOLOv4</span>目标检测实战:人脸口罩佩戴识别》<span></span> </p> <p> 《<span>Windows</span>版<span>YOLOv4</span>目标检测实战:中国交通标志识别》<span></span> </p> <p> 《<span>Windows</span>版<span>YOLOv4</span>目标检测:原理与源码解析》<span></span> </p> <p> <span> <img alt="" src="https://img-bss.csdnimg.cn/202007061503586145.jpg" /></span> </p> <p> <span><img alt="" src="https://img-bss.csdnimg.cn/202007061504169339.jpg" /><br /> </span> </p>
©️2020 CSDN 皮肤主题: 终极编程指南 设计师:CSDN官方博客 返回首页