wpf之行为

前言

行为是WPF中用于增强UI元素功能的一种重要模式,它允许在不修改原始控件代码的情况下,为控件添加交互逻辑。它可以封装某些功能(如拖放、命令执行、状态管理等),使这些功能可以在不同控件间复用

1、新建行为类

下面的代码给所有控件添加一个行为,添加行为分为两个步骤,第一步就是新建一个类继承Behavior,第二步就是在view视图代码中给指定的控件附加行为, Behavior中的T用于指定行为可以用在哪种控件上,这里使用了Control,由于Control是所有控件的基类,所以所以这个行为可以被所有控件使用,当鼠标进入控件时(在控件上方)更改控件的字体颜色为黄色,当鼠标离开控件时恢复控件原来的字体颜色。行为主要是重写OnAttached和OnDetaching方法,在OnAttached方法中订阅事件,在OnDetaching方法方法中取消订阅事件。下面的代码中在OnAttached订阅了MouseEnter和MouseLeave两个事件。

csharp 复制代码
class ChangeForegroundBehavior : Behavior<Control>
    {
        private Brush originalForeground;
        private static readonly Brush hoverBrush = Brushes.Yellow  ;

        protected override void OnAttached()
        {
            base.OnAttached();
            originalForeground = AssociatedObject.Foreground ;
            AssociatedObject.MouseEnter += OnMouseEnter;
            AssociatedObject.MouseLeave += OnMouseLeave;
        }

        protected override void OnDetaching()
        {
            base.OnDetaching();
            // 取消订阅事件
            AssociatedObject.MouseEnter -= OnMouseEnter;
            AssociatedObject.MouseLeave -= OnMouseLeave;
        }

        private void OnMouseEnter(object sender, MouseEventArgs e)
        {
            // 当鼠标进入时,改变字体颜色
            AssociatedObject.Foreground  = hoverBrush;
        }

        private void OnMouseLeave(object sender, MouseEventArgs e)
        {
            // 当鼠标离开时,恢复字体颜色
            AssociatedObject.Foreground = originalForeground;
        }
    }

2、给指定控件添加行为

下面的代码中分别给Label 和Button添加ChangeForegroundBehavior行为,

csharp 复制代码
<Window x:Class="行为.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:行为"
        xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
        xmlns:ei="clr-namespace:Microsoft.Xaml.Behaviors.Core;assembly=Microsoft.Xaml.Behaviors"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions >
            <RowDefinition Height="1*"/>
            <RowDefinition Height="1*"/>
        </Grid.RowDefinitions >
        <Label   Grid.Row=" 0" Content="test" Width="100" Height="30" Foreground="Red"  Background="Blue"  FontSize="15">
            <i:Interaction.Behaviors>
                <local:ChangeForegroundBehavior />
            </i:Interaction.Behaviors>
        </Label>
        <Button  Grid.Row=" 1" Content="test" Width="100" Height="30" Foreground="Red"  FontSize="15">
            <i:Interaction.Behaviors>
                <local:ChangeForegroundBehavior />
            </i:Interaction.Behaviors>
        </Button>
    </Grid>
</Window>

1)鼠标放在Label上方时

2)鼠标离开Label上方时

相关推荐
z落落7 小时前
C#WinForm 窗体切换与窗体传值(登录跳转案例)+WinForm 窗体传值(从上往下传、从下往上传)
开发语言·windows·c#
ytttr87310 小时前
C# 定时数据库备份工具
开发语言·数据库·c#
雪豹阿伟12 小时前
21.Winfrom —— 定时器、日期选择器、进度条、表格、DataTable
c#·上位机·winfrom
z落落12 小时前
C#WinForm控件实战:Panel与单选框动态创建
开发语言·c#
qq_4221525714 小时前
Word 文件太大怎么压缩?2026 年文档瘦身方案对比
开发语言·c#·word
影寂ldy16 小时前
C# 事件完整学习笔记(发布订阅 + 自定义事件 + 内置 EventHandler)
笔记·学习·c#
myenjoy_116 小时前
大规模采集架构——从单台网关到千点集群
架构·wpf
kyle~17 小时前
DDS分布式实时系统---自省机制
开发语言·分布式·机器人·c#·接口·ros2
Java面试题总结17 小时前
MarkItDown 再次登顶GitHub榜
开发语言·c#·github
xiaoshuaishuai818 小时前
C# 定制化Markdown编辑器
开发语言·c#·编辑器