WPF设计标准学习记录29

打印 上一主题 下一主题

主题 1831|帖子 1831|积分 5493

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. public class TextBehavior : Behavior<TextBlock>
  2. {
  3.     protected override void OnAttached()
  4.     {
  5.         base.OnAttached();
  6.         AssociatedObject.MouseEnter += AssociatedObject_MouseEnter;
  7.         AssociatedObject.MouseLeave += AssociatedObject_MouseLeave;
  8.     }
  9.     protected override void OnDetaching()
  10.     {
  11.         base.OnDetaching();
  12.         AssociatedObject.MouseEnter -= AssociatedObject_MouseEnter;
  13.         AssociatedObject.MouseLeave -= AssociatedObject_MouseLeave;
  14.     }
  15.     private void AssociatedObject_MouseEnter(object sender,
  16.         System.Windows.Input.MouseEventArgs e)
  17.     {
  18.         var element = sender as TextBlock;
  19.         DropShadowEffect effect = new DropShadowEffect();
  20.         effect.Color = Colors.Gold;
  21.         effect.ShadowDepth = 0;
  22.         effect.BlurRadius = 15;
  23.         element.Effect = effect;            
  24.     }
  25.     private void AssociatedObject_MouseLeave(object sender,
  26.         System.Windows.Input.MouseEventArgs e)
  27.     {
  28.         var element = sender as TextBlock;
  29.         DropShadowEffect effect = new DropShadowEffect();
  30.         effect.Color = Colors.Gold;
  31.         effect.ShadowDepth = 0;
  32.         effect.BlurRadius = 15;
  33.         element.Effect = null;
  34.     }
  35. }
复制代码
  1. public class TextBehavior : Behavior<TextBlock>
  2. {
  3.     // 当行为附加到TextBlock时的初始化操作
  4.     protected override void OnAttached()
  5.     {
  6.         base.OnAttached();
  7.         // 绑定鼠标进入/离开事件(实现悬停交互)
  8.         AssociatedObject.MouseEnter += AssociatedObject_MouseEnter;
  9.         AssociatedObject.MouseLeave += AssociatedObject_MouseLeave;
  10.         // [!] 未校验AssociatedObject空引用风险
  11.     }
  12.     // 当行为从TextBlock分离时的清理操作
  13.     protected override void OnDetaching()
  14.     {
  15.         base.OnDetaching();
  16.         // 解除事件绑定(避免内存泄漏)
  17.         AssociatedObject.MouseEnter -= AssociatedObject_MouseEnter;
  18.         AssociatedObject.MouseLeave -= AssociatedObject_MouseLeave;
  19.         // [!] 未重置Effect可能导致残留状态
  20.     }
  21.     // 鼠标进入事件:添加金色辉光效果
  22.     private void AssociatedObject_MouseEnter(object sender, MouseEventArgs e)
  23.     {
  24.         var element = sender as TextBlock;
  25.         // [!] 未处理element空值可能导致崩溃
  26.         DropShadowEffect effect = new DropShadowEffect();
  27.         effect.Color = Colors.Gold;    // 固定金色调
  28.         effect.ShadowDepth = 0;        // 无偏移的全向辉光
  29.         effect.BlurRadius = 15;        // 模糊强度固定值
  30.         element.Effect = effect;       // [!] 高频创建对象可能引发GC压力
  31.     }
  32.     // 鼠标离开事件:移除视觉效果
  33.     private void AssociatedObject_MouseLeave(object sender, MouseEventArgs e)
  34.     {
  35.         var element = sender as TextBlock;
  36.         // [!] 冗余创建未使用的Effect对象(建议直接置空)
  37.         element.Effect = null;         // 清除效果
  38.         // [!] 未考虑平滑过渡动画
  39.     }
  40. }
复制代码
  1. graph TD
  2.     A[行为附加到TextBlock] --> B[注册MouseEnter/MouseLeave事件]
  3.     B --> C{用户悬停交互}
  4.     C -->|MouseEnter| D[创建金色辉光效果]
  5.     C -->|MouseLeave| E[移除效果]
  6.     F[行为分离] --> G[解除事件绑定]
  7.    
  8.     style D stroke:#FFD700,stroke-width:2px
  9.     classDef warning fill:#FFF3E0,stroke:#FFA726;
  10.     class B,F warning
复制代码
2. 优化实现建议

  1. // 增强版代码示例(含动画与资源优化)
  2. public class EnhancedTextBehavior : Behavior<TextBlock>
  3. {
  4.     private static readonly DropShadowEffect _sharedEffect = new DropShadowEffect
  5.     {
  6.         Color = Colors.Gold,
  7.         ShadowDepth = 0,
  8.         BlurRadius = 0  // 初始值
  9.     };
  10.     protected override void OnAttached()
  11.     {
  12.         AssociatedObject.Effect = _sharedEffect;  // 共享静态资源
  13.         AssociatedObject.MouseEnter += StartGlowAnimation;
  14.         AssociatedObject.MouseLeave += StartFadeAnimation;
  15.     }
  16.     private void StartGlowAnimation(object sender, MouseEventArgs e)
  17.     {
  18.         _sharedEffect.BeginAnimation(DropShadowEffect.BlurRadiusProperty,
  19.             new DoubleAnimation(15, TimeSpan.FromSeconds(0.3)) { EasingFunction = new CubicEase() });
  20.     }
  21.     private void StartFadeAnimation(object sender, MouseEventArgs e)
  22.     {
  23.         _sharedEffect.BeginAnimation(DropShadowEffect.BlurRadiusProperty,
  24.             new DoubleAnimation(0, TimeSpan.FromSeconds(0.5)) { EasingFunction = new BackEase() });
  25.     }
  26. }
复制代码
  1. <Window x:Class="HelloWorld.MainWindow"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6.         xmlns:local="clr-namespace:HelloWorld"
  7.         xmlns:controls="clr-namespace:HelloWorld.Controls"
  8.         xmlns:helper="clr-namespace:HelloWorld.MVVM"
  9.         xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
  10.         xmlns:behavior="clr-namespace:HelloWorld.Behaviors"
  11.         mc:Ignorable="d" Background="DarkCyan"
  12.         Title="WPF中文网 - 行为 - www.wpfsoft.com"  >
  13.     <Window.DataContext>
  14.         <local:MainViewModel/>
  15.     </Window.DataContext>
  16.     <Canvas>
  17.         <TextBlock Text="WPF中文网"
  18.                    Foreground="White"
  19.                    FontSize="60"
  20.                    Canvas.Left="92"
  21.                    Canvas.Top="75">
  22.             <i:Interaction.Behaviors>
  23.                 <behavior:TextBehavior/>
  24.             </i:Interaction.Behaviors>
  25.         </TextBlock>
  26.         <TextBlock Text="Behavior行为之阴影
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表