• WPF学习笔记-行为


    样式和资源字典能在一定范围上设置界面的属性效果,但是这些都是相对的是静态的,即使是动态的,也是先定义好的,无法直接按人的操作行为去设置效果。

    这里来实现拖动功能,需要引用System.Windows.Interactivity.dll程序集

    一,创建行为

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 using System.Windows;
     7 using System.Windows.Controls;
     8 using System.Windows.Input;
     9 using System.Windows.Interactivity;
    10 using System.Windows.Media;
    11 
    12 namespace CustomsXW
    13 {
    14     public class DragInCanvasBehavior : Behavior<UIElement>
    15     {
    16         private Canvas canvas;
    17 
    18         protected override void OnAttached()
    19         {
    20             base.OnAttached();
    21 
    22            //鼠标左键按下,移动,左键松开     事件 
    23             this.AssociatedObject.MouseLeftButtonDown += AssociatedObject_MouseLeftButtonDown;
    24             this.AssociatedObject.MouseMove += AssociatedObject_MouseMove;
    25             this.AssociatedObject.MouseLeftButtonUp += AssociatedObject_MouseLeftButtonUp;
    26         }
    27 
    28         protected override void OnDetaching()
    29         {
    30             base.OnDetaching();
    31 
    32        
    33             this.AssociatedObject.MouseLeftButtonDown -= AssociatedObject_MouseLeftButtonDown;
    34             this.AssociatedObject.MouseMove -= AssociatedObject_MouseMove;
    35             this.AssociatedObject.MouseLeftButtonUp -= AssociatedObject_MouseLeftButtonUp;
    36         }
    37 
    38         // 是否拖动中
    39         private bool isDragging = false;
    40 
    41         // 鼠标点位置元素
    42         private Point mouseOffset;
    43 
    44         private void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    45         {
    46             // 获取画板
    47             if (canvas == null) canvas = VisualTreeHelper.GetParent(this.AssociatedObject) as Canvas;
    48 
    49             // 开始拖动准备
    50             isDragging = true;
    51 
    52             //获取当前元素的点位置,默认右上坐标0,0
    53           
    54             mouseOffset = e.GetPosition(AssociatedObject);
    55 
    56             // 捕获鼠标
    57             AssociatedObject.CaptureMouse();
    58         }
    59 
    60         private void AssociatedObject_MouseMove(object sender, MouseEventArgs e)
    61         {
    62             if (isDragging)
    63             {
    64                 // 拖动中,一直实时获取画板的点位置
    65                 Point point = e.GetPosition(canvas);
    66 
    67                 // 实时在画板的上设置元素点位置
    68                 AssociatedObject.SetValue(Canvas.TopProperty, point.Y - mouseOffset.Y);
    69                 AssociatedObject.SetValue(Canvas.LeftProperty, point.X - mouseOffset.X);
    70             }
    71         }
    72 
    73         private void AssociatedObject_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    74         {
    75             if (isDragging)
    76             {
    77                 //移动结束,松开鼠标,释放捕获鼠标
    78                 AssociatedObject.ReleaseMouseCapture();
    79                 isDragging = false;
    80             }
    81         }
    82     }
    83 }
    View Code

    二,使用行为

    记得要引用

     1 <Window x:Class="WPFdemo13.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:WPFdemo13"
     7         mc:Ignorable="d"
     8         xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
     9         xmlns:custom="clr-namespace:CustomsXW;assembly=CustomsXW"
    10         Title="MainWindow" Height="350" Width="525">
    11     <Grid>
    12         <Canvas>
    13             <Rectangle Height="30" Width="30" Stroke="Black" Fill="Red">
    14                 <i:Interaction.Behaviors>
    15                     <custom:DragInCanvasBehavior></custom:DragInCanvasBehavior>
    16                     <!--有时候初次加载一直会提示错误,需要重启-->
    17                 </i:Interaction.Behaviors>
    18 
    19             </Rectangle>
    20             
    21         </Canvas>
    22 
    23     </Grid>
    24 </Window>
    View Code

    效果:

  • 相关阅读:
    Elasticsearch (二) 索引
    Elasticsearch (一)搭建与启动
    IDEA 插件
    IDEA 导入华丽的皮肤
    Tomcat https 访问
    oracle系统视图SQL语句整理
    Java内存优化和性能优化的几点建议
    Tomcat配置SSL证书
    sublime集成MinGW,打造C/C++开发环境
    一个简单的Vue.js组件开发示例
  • 原文地址:https://www.cnblogs.com/anyihen/p/12961587.html
Copyright © 2020-2023  润新知