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这一节

 

 

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

 

 

 

 

posted @ 2012-05-14 15:47  iiixxxiii  阅读(791)  评论(3编辑  收藏  举报