26.WPF 行为

摘要


  Expression Blend创作者开发了称为行为(behavior)的特征。其思想很简单:创建封装了一些通用用户界面功能的行为。这一功能可以是基本功能(如启动故事板或导航到超链接),也可以是复杂功能(如处理多点触摸交互,或构建使用实时物理引擎的碰撞模型)。一旦构建功能,就可将它们添加到任意应用程序的另一个控件中,具体方法是将该控件链接到适当的行为并设置行为的属性。在Expression Blend中,只通过拖放操作就可以使用行为。

正文


行为的用法有些类似触发器的效果,但是触发器一般只能适用同一种的控件;而一个行为可以用在不同控件下(指定相同的父类)

Nuget 安装System.Windows.Interactivity.dll Blend.Interctivity.WPF.v4.0

我们把以前的拖功能写成行为


    
        
            
                
            
        
        
            
                
            
        
        
            
                
            
        
    

写一个行为类

public class DragBehavior:Behavior
{
    private Canvas canvas;
    private bool _isDragging;
    private Point _mouseOffset;

    protected override void OnAttached()
    {
        base.OnAttached();
        this.AssociatedObject.MouseLeftButtonDown += AssociatedObject_MouseLeftButtonDown;
        this.AssociatedObject.MouseMove += AssociatedObject_MouseMove;
        this.AssociatedObject.MouseLeftButtonUp += AssociatedObject_MouseLeftButtonUp;
    }

    private void AssociatedObject_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        if (_isDragging)
        {
            AssociatedObject.ReleaseMouseCapture();
            _isDragging = false;
        }
    }

    private void AssociatedObject_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
    {
        if (_isDragging)
        {
            Point point = e.GetPosition(canvas);
            AssociatedObject.SetValue(Canvas.TopProperty,point.Y-_mouseOffset.Y);
            AssociatedObject.SetValue(Canvas.LeftProperty,point.X-_mouseOffset.X);
        }
    }

    private void AssociatedObject_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        if (canvas == null)
        {
            canvas = VisualTreeHelper.GetParent(this.AssociatedObject) as Canvas;
        }
        _isDragging = true;
        _mouseOffset=e.GetPosition(AssociatedObject);
        AssociatedObject.CaptureMouse();
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        this.AssociatedObject.MouseLeftButtonDown -= AssociatedObject_MouseLeftButtonDown;
        this.AssociatedObject.MouseMove -= AssociatedObject_MouseMove;
        this.AssociatedObject.MouseLeftButtonUp -= AssociatedObject_MouseLeftButtonUp;
    }
}
26.WPF 行为

一个背景样式行为

通过AssociatedObject(关联对象:是行为的关联对象,类型为我们指定的FrameworkElement),实现实际行为的触发:鼠标移入,背景高亮效果。


    
        
            
                
            
        
        
    

行为类

internal class EffectBehavior : Behavior
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.MouseEnter += AssociatedObject_MouseEnter;
        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_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
    {
        var element = sender as FrameworkElement;
        element.Effect = (Effect)new DropShadowEffect() { Color = Colors.Blue, ShadowDepth = 0 };
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.MouseEnter -= AssociatedObject_MouseEnter;
        AssociatedObject.MouseLeave -= AssociatedObject_MouseLeave;
    }
}
行为   WPF
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章