【WPF学习笔记】WPF中行为(Behavior)的简单使用

WPF中行为(Behavior)的简单使用

在我之前的 WPF 开发中,需要实现一些页面效果时,常使用到的方式就是重写元素的样式(Style),然后再样式里面设置使用元素的各类触发器(Trigger)来实现效果。这样常常需要编写大量的代码。

近日学习到 WPF 中有一个叫做 Behavior 的扩展方式,可以用来实现页面效果,实现方式更为简便。学习笔记如下:

添加需要的DLL库

要使用 Behavior 的相关功能需要先添加 “System.Windows.Interactivity” 库。可以通过 Nuget 进行安装。

如下图:

在这里插入图片描述

安装完成后如下图:

在这里插入图片描述

编写自己需要的 EffectBehavior 类

如下代码中,定义的 Behavior 类的为 EffectBehavior。EffectBehavior 需要继承自 Behavior<T>。

按 F12 进入 Behavior 的源码中可知,T (下面代码中为 FrameworkElement)为该行为需要产生作用的元素的类型,通过 AssociatedObject 进行关联。

在这里插入图片描述

代码如下:实现了鼠标悬停的时候,元素进行红色边框高亮显示。

using System.Windows;
using System.Windows.Interactivity;
using System.Windows.Media;
using System.Windows.Media.Effects;

namespace BehaviorDemo
{
    // Behavior<T> T设置行为产生作用的元素类型
    public class EffectBehavior : Behavior<FrameworkElement>
    {
        //使用 Behavior 必须重写以下两个虚方法
        protected override void OnAttached()
        {
            base.OnAttached();

            //AssociatedObject为关联对象, 是Behavior<T>中的T
            AssociatedObject.MouseMove += AssociatedObject_MouseMove;
            AssociatedObject.MouseLeave += AssociatedObject_MouseLeave;
        }

        private void AssociatedObject_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
        {
            var element = sender as FrameworkElement;
            element.Effect = (Effect)new DropShadowEffect() { Color = Colors.Transparent, ShadowDepth = 0 };
        }

        private void AssociatedObject_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
        {
            var element = sender as FrameworkElement;
            element.Effect = (Effect)new DropShadowEffect() { Color = Colors.Red, ShadowDepth = 0 };
        }

        protected override void OnDetaching()
        {
            base.OnDetaching();
            AssociatedObject.MouseMove -= AssociatedObject_MouseMove;
            AssociatedObject.MouseLeave -= AssociatedObject_MouseLeave;
        }
    }
}

界面中引用 EffectBehavior

要在 XAML 代码中使用 Behavior,需要引入命名空间

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

具体代码如下:

<Window
    x:Class="BehaviorDemo.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:local="clr-namespace:BehaviorDemo"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <Grid>
        <StackPanel>
            <TextBox
                Width="100"
                Height="30"
                Margin="40">
                <i:Interaction.Behaviors>
                    <local:EffectBehavior />
                </i:Interaction.Behaviors>
            </TextBox>
            <Button
                Width="100"
                Height="30"
                Margin="40">
                <i:Interaction.Behaviors>
                    <local:EffectBehavior />
                </i:Interaction.Behaviors>
            </Button>
        </StackPanel>
    </Grid>
</Window>

实现效果如下:

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值