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这一节
下章我会讲下缩短绑定写法和传递控件