zoukankan      html  css  js  c++  java
  • Caliburn.Micro for wp7 学习笔记(4) : 自由添加事件绑定2

    或许有人对上一篇说的还有有比理解的,可以看这篇  解析Caliburn.Micro(四) 的 "ElementConvention" 这一节

    实验发现 

    ConventionManager.AddElementConvention<Border>(null, "", "Tap");
    

      这样也是可以绑定事件的,最重要的是最后一个 参数 代表的是要绑定方法到哪个的事件上

    假设我对一个控件设定了2个规则会怎么样?

    在AddCustomConventions()添加一个规则现在AddCustomConventions()的内容如下

    1         static void AddCustomConventions() {
    2       
    3             ConventionManager.AddElementConvention<Border>(Border.DataContextProperty, "DataContext", "Tap");
    4        
    5             ConventionManager.AddElementConvention<Border>(Border.DataContextProperty, "DataContext", "DoubleTap");
    6              
    7         }

    运行下,可以发现单击不起作用了,要双击才能触发事件,可见 同一个控件 设定不同规则,后面一个会覆盖前面一个

    这就产生了个问题我要说在一个控件上想要绑定2个事件怎么办?即我想单击 Border 触发一个事件 ,双击 Border 触发另外一个事件

    接下来就说下如何在一个控件上绑定多个事件

    现在打开 MainPage.xaml

    头部添加

     xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
     xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"  

    然后在Border标签内加入事件绑定,代码如下,我们修改的是蓝色的 Border

            <Border BorderBrush="Silver" BorderThickness="1" Height="87" HorizontalAlignment="Left" Margin="128,445,0,0" Name="border2" VerticalAlignment="Top" Width="143" Background="Blue">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Tap">
                        <cal:ActionMessage MethodName="BorderTap"  >
    
                        </cal:ActionMessage>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Border>

    在MainPageViewModel.cs 里添加 BorderTap() 方法

           public void  BorderTap()
            {
             
                MessageBox.Show("BorderTap");
           
            }

    然后运行,你会发现红色的 Border 需要双击才会触发事件蓝色的单击后会触发 BorderTap() 方法

    然后修改Border 标签,代码如下

    <Border BorderBrush="Silver" BorderThickness="1" Height="87" HorizontalAlignment="Left" Margin="128,445,0,0" Name="border2" VerticalAlignment="Top" Width="143" Background="Blue">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="DoubleTap">
                        <cal:ActionMessage MethodName="BorderDoubleTap"  >
    
                        </cal:ActionMessage>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Border>

    在MainPageViewModel.cs 里添加 BorderDoubleTap() 方法

           public void BorderDoubleTap()
           {
    
               MessageBox.Show("BorderDoubleTap");
    
           }

    运行后,双击蓝色的  Border 你会发现只触发了 BorderDoubleTap()这个方法,虽然你在 MainPageViewModel.cs 里还定义了 和它名称一样的 border2() 方法,但是不会重复的绑定

    现在我们要实现这样一个功能 单击 Border 触发一BorderTap() ,双击 Border 触发BorderDoubleTap(),由于MessageBox会弹出提示框阻止了点击事件,所以修改下

    BorderTap() 和BorderDoubleTap() 方法,我们用颜色来表示单击和双击,我们设定:单击Border 变成黄色 ,双击Border 变成绿色

    要改变颜色首先要获取到 自身这个Border ,那么如何获取?

    我们将Border 标签改成如下代码

            <Border BorderBrush="Silver" BorderThickness="1" Height="87" HorizontalAlignment="Left" Margin="128,445,0,0" Name="border2" VerticalAlignment="Top" Width="143" Background="Blue">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="DoubleTap">
                        <cal:ActionMessage MethodName="BorderDoubleTap"  >
                            <cal:Parameter Value="$eventArgs"/>
                        </cal:ActionMessage>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Border>

    cal:Parameter 意思是传递参数 ,Value="$eventArgs"  代表的是参数内容 $eventArgs 代表传递的是事件

    我们知道如果在代码中绑定事件 会是这样的

               Border border = new Border();
                border.Tap += new System.EventHandler<GestureEventArgs>(border_Tap);

    方法是这样

           void border_Tap(object sender, GestureEventArgs e)
            {
                throw new System.NotImplementedException();
            }

    $eventArgs 代表是就是 GestureEventArgs e

     所以最后代码如下

    MainPage.xaml

    <Border BorderBrush="Silver" BorderThickness="1" Height="87" HorizontalAlignment="Left" Margin="128,445,0,0" Name="border2" VerticalAlignment="Top" Width="143" Background="Blue">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Tap">
                        <cal:ActionMessage MethodName="BorderTap"  >
                            <cal:Parameter Value="$eventArgs"/>
                        </cal:ActionMessage>
                    </i:EventTrigger>
                    <i:EventTrigger EventName="DoubleTap">
                        <cal:ActionMessage MethodName="BorderDoubleTap"  >
                            <cal:Parameter Value="$eventArgs"/>
                        </cal:ActionMessage>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Border>

    MainPageViewModel.cs

            public void BorderTap(GestureEventArgs e)
            {
                var border = e.OriginalSource as Border;
    
                border.Background = new SolidColorBrush(Colors.Yellow);
           
            }
     
    
            public void BorderDoubleTap(GestureEventArgs e)
           {
    
               var border = e.OriginalSource as Border;
    
               border.Background = new SolidColorBrush(Colors.Green);
    
           }

    运行后就可以看到效果,单击变黄色,双击变绿色

    更多<cal:Parameter Value="$eventArgs"/> 中Value的值用法请看 解析Caliburn.Micro(二)中的 ActionMessage这一节

     下章我会讲下缩短绑定写法和传递控件

  • 相关阅读:
    Gitlab邮箱配置
    Zabbix邮件告警提示Couldn't resolve host name解决办法
    Gitlab备份和恢复操作
    Gitlab权限管理
    编译安装Nginx
    [0] 数据库读写分离
    [0] C# & MongoDB
    [0] 平衡二叉树
    [0] 分布式存储 Memcached
    [0] MSSQL 分库查询
  • 原文地址:https://www.cnblogs.com/iiixxxiii/p/2498896.html
Copyright © 2011-2022 走看看