WPF 使用 Behavior 库辅助获取动态资源变更事件

在 WPF 开发中,可以使用 Behavior 库辅助,监听某个动态资源变更的事件,从而了解到是在哪个模块变更了动态资源,或者根据动态资源的变更而进行界面修改

在 WPF 的动态资源机制里面,如果某个依赖属性给定了动态资源,那么在动态资源变更的时候,将会重新给属性赋值。通过这个机制,就可以在业务逻辑上,通过添加一个依赖属性,绑定到需要监听变更的动态资源上,那么这个依赖属性将会收到变更通知

在我的应用里面,有很复杂的资源逻辑,我需要调试是哪个模块在修改资源,可以使用本文下面提供的方法

在开始之前,请先安装 Behavior 库,请通过 NuGet 安装 Microsoft.Xaml.Behaviors.Wpf 库。如果是 SDK 风格的 csproj 可以添加如下代码安装

  <ItemGroup>
    <PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.31" />
  </ItemGroup>

接下来编写 ResourceChangeEventBehavior 类用来监听动态资源变更

    public class ResourceChangeEventBehavior : Behavior<FrameworkElement>
    {
        public static readonly DependencyProperty ResourceProperty = DependencyProperty.Register(
            "Resource", typeof(object), typeof(ResourceChangeEventBehavior), new PropertyMetadata(default(object), ResourceChangedCallback));

        public event EventHandler<ResourceChangedEventArgs> ResourceChanged;

        public object Resource
        {
            get { return GetValue(ResourceProperty); }
            set { SetValue(ResourceProperty, value); }
        }

        private static void ResourceChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
        {
            if (dependencyObject is ResourceChangeEventBehavior resourceChangeNotifier)
            {
                resourceChangeNotifier.OnResourceChanged(new ResourceChangedEventArgs(args.OldValue, args.NewValue));
            }
        }

        private void OnResourceChanged(ResourceChangedEventArgs args)
        {
            ResourceChanged?.Invoke(this, args);
        }
    }

    public class ResourceChangedEventArgs : EventArgs
    {
        public ResourceChangedEventArgs(object oldValue, object newValue)
        {
            OldValue = oldValue;
            NewValue = newValue;
        }

        public object OldValue { get; }
        public object NewValue { get; }
    }

可以看到实际使用的逻辑就是在 Resource 这个依赖属性变更的时候,触发 ResourceChanged 事件

以上就是所有的框架代码,使用方法如下,如下面代码将要监听 VariableFontSize 这个动态资源的变更

    <i:Interaction.Behaviors>
      <resourceChangeEvent:ResourceChangeEventBehavior
        Resource="{DynamicResource VariableFontSize}"
        ResourceChanged="OnResourceChanged_VariableFontSize" />
    </i:Interaction.Behaviors>

全部的 XAML 代码如下

<Window x:Class="JeyaijikeneeWhejoniwairbu.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:resourceChangeEvent="clr-namespace:JeyaijikeneeWhejoniwairbu"
        xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
        xmlns:system="clr-namespace:System;assembly=System.Runtime"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
  <Window.Resources>
    <system:Double x:Key="VariableFontSize">5</system:Double>
  </Window.Resources>
  <Grid>
    <i:Interaction.Behaviors>
      <resourceChangeEvent:ResourceChangeEventBehavior
        Resource="{DynamicResource VariableFontSize}"
        ResourceChanged="OnResourceChanged_VariableFontSize" />
    </i:Interaction.Behaviors>
    <Button Margin="10,10,10,10" HorizontalAlignment="Left" VerticalAlignment="Top" Content="Change Resource" Click="Button_OnClick"/>
  </Grid>
</Window>

在点击按钮变更动态资源

        private void OnResourceChanged_VariableFontSize(object? sender, ResourceChangedEventArgs e)
        {

        }

        private void Button_OnClick(object sender, RoutedEventArgs e)
        {
            Resources["VariableFontSize"] = 10d;
        }

本文代码放在 githubgitee 欢迎下载执行,可以看到在点击按钮的时候进入 OnResourceChanged_VariableFontSize 方法

使用这个方法可以快速调试是在哪个模块变更了动态资源,也可以通过本文的方法在某个动态资源变更的时候执行其他逻辑,如动画

其实不使用 Behavior 库,使用附加属性也能实现相同的效果,但是使用 Behavior 库可以绑定到其他逻辑

特别感谢 jeromerg 大佬提供的方法,详细请看 https://github.com/jeromerg/WpfResourceChangeEvent 本文大部分代码都从这个仓库抄

我搭建了自己的博客 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> <strong><span style="font-size:20px;color:#FF0000;">本课程主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者</span></strong> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">1. 包含:<span style="color:#FFFF00;background-color:#FF0000;">项目源码、</span><span style="color:#FFFF00;background-color:#FF0000;">项目文档、数据脚本、软件工具</span>等所有资料</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">2. 手把手的带你从零开始部署运行本套系统</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">3. 该项目附带的源码资料可作为毕设使用</span></strong></span> </p> <p> <span style="color:#FF0000;"><strong><span style="font-size:18px;">4. 提供技术答疑和远程协助指导</span></strong></span><strong><span style="font-size:18px;"></span></strong> </p> <p> <br /> </p> <p> <span style="font-size:18px;"><strong>项目运行截图:</strong></span> </p> <p> <strong><span style="font-size:18px;">1)系统登陆界面</span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241015433522.png" alt="" /><br /> </span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">2)学生模块</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241015575966.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">3)教师模块</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016127898.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">4)系统管理员</span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016281177.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/202002241016369884.png" alt="" /></span></strong> </p> <p> <strong><span style="font-size:18px;"><br /> </span></strong> </p> <p> <strong><span style="font-size:18px;"><strong><span style="font-size:18px;">更多Java毕设项目请关注我的毕设系列课程 <a href="https://edu.csdn.net/lecturer/2104">https://edu.csdn.net/lecturer/2104</a></span></strong></span></strong> </p> <p> <strong><span style="font-size:18px;"><br /> </span></strong> </p>
<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官方博客 返回首页