• SilverLight:在MVVM中实现多事件


      在开发Silverlight项目时,如果使用了MVVM架构时,可以实现业务逻辑与界面的完全分离。事件可以通过实现接口ICommand达到效果,比如:Button控件,如果要实现单击效果时,可以通过绑定Command即可。

      但是如果需要实现鼠标离开Button事件怎么实现呢,就这是今天需要讨论的问题=》多事件实现

      项目架构如下图:

      

      我今天主要用Button做实验,来实现Button控件的单击事件和鼠标离开事件。这在非MVVM架构下非常容易实现。但是在MVVM架构,我们需要引用System.Windows.Interactivity.dll,此动态库存放的位置为C:\Program Files\Microsoft SDKs\Expression\Blend 3\Interactivity\Libraries\Silverlight\System.Windows.Interactivity.dll

      关于System.Windows.Interactivity.dll的介绍,请查看http://msdn.microsoft.com/zh-cn/library/system.windows.interactivity(v=Expression.40).aspx

      通过引用动态库,然后在MainPage.xaml中实现Button的两个事件。代码如下:

      MainPage.xaml

    <UserControl x:Class="MoreEvent.MainPage"
        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:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:local
    ="clr-namespace:MoreEventViewModel;assembly=MoreEventViewModel"
        mc:Ignorable
    ="d"
        d:DesignHeight
    ="300" d:DesignWidth="400">
        
    <UserControl.Resources>
            
    <local:MoreEventsViewModel x:Key="k"/>
        
    </UserControl.Resources>
        
    <Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource k}">
            
    <Button Content="测试多事件" Width="70" Height="25">
                
    <i:Interaction.Triggers>
                    
    <i:EventTrigger EventName="Click">
                        
    <i:InvokeCommandAction Command="{Binding BtnClick}"/>
                    
    </i:EventTrigger>
                    
    <i:EventTrigger EventName="MouseLeave">
                        
    <i:InvokeCommandAction Command="{Binding MouseLeave}"/>
                    
    </i:EventTrigger>
                
    </i:Interaction.Triggers>
            
    </Button>
        
    </Grid>
    </UserControl>

      那么ViewModel和ICommand的实现非常简单,两个文件的代码如下

      MoreEventsViewModel.cs

    using System;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Ink;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;

    namespace MoreEventViewModel
    {
        
    public class MoreEventsViewModel
        {
            
    public MoreEventsViewModel()
            { 
            
            }

            
    private void MouseLeaveEvent(object obj)
            {
                MessageBox.Show(
    "测试鼠标离开事件");
            }
            
    private void BtnClickEvent(object obj)
            {
                MessageBox.Show(
    "测试单击事件");
            }

            
    public ICommand MouseLeave
            {
                
    get { return new MoreEventCommand(MouseLeaveEvent); }
            }
            
    public ICommand BtnClick
            {
                
    get { return new MoreEventCommand(BtnClickEvent); }
            }
        }
    }

      MoreEventCommand.cs

    using System;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Ink;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;

    namespace MoreEventViewModel
    {
        
    public class MoreEventCommand:ICommand
        {
            Action
    <object> _action;
            
    public MoreEventCommand(Action<object> ac)
            {
                _action 
    = ac;
            }
            
    public bool CanExecute(object parameter)
            {
                
    return true;
            }

            
    public event EventHandler CanExecuteChanged;

            
    public void Execute(object parameter)
            {
                
    if (_action != null)
                    _action(parameter);
            }
        }
    }

      通过以上方法即可在MVVM实现多事件.通过这个件事,大家可以触类旁通,实现其它控件的多事件。希望对大家有用。

      点击下载源程序

     

  • 相关阅读:
    Neo4j自定义主键策略
    spring cloud Alibaba nacos 整合Neo4j pom 配置
    spring cloud Alibaba nacos 整合Neo4j配置
    若依前端 devtool source-map设置
    基于draw.io的二次开发,文件增加本地以及oss存储
    十多年来从三个容器管理系统中吸取的教训
    java8 CompletableFuture,allOf多实例返回
    CompletableFuture 使用详解
    使用CompletableFuture实现业务服务的异步调用
    [转]uni-app开发踩坑之路之this指向问题
  • 原文地址:https://www.cnblogs.com/888h/p/1900621.html
Copyright © 2020-2023  润新知