码迷,mamicode.com
首页 > 其他好文 > 详细

Xamarin.Forms 自定义 TapGestureRecognizer 附加属性

时间:2019-03-20 15:57:48      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:add   ini   cat   string   custom   any   move   res   ice   

While creating Xamarin.Forms applications, definitely you are going to need TapGestureRecognizer often. Implementing it in XAML many times may end up with a lot of unnecessary code. Let’s take a look at that simple clickable Image:

1 <Image Source="img.png">
2   <Image.GestureRecognizers>
3     <TapGestureRecognizer Command="{Binding CloseCommand}" CommandParamter="{Binding .}" />
4   </Image.GestureRecognizers>
5 </Image>

This is a lot of lines, especially when you have to add many clickable controls. However, we can do it better and put everything into a single line using our custom attached property:

XHTML

xmlns:ex="clr-namespace:MyApp.Extensions;assembly=MyApp"
...
<Image Source="img.png" ex:Gestures.TapCommand="{ex:Command CloseCommand, Parameter={Binding .}}"/>

xmlns:ex="clr-namespace:MyApp.Extensions;assembly=MyApp"
...
<Image Source="img.png" ex:Gestures.TapCommand="{ex:Command CloseCommand, Parameter={Binding .}}"/>

Implementation

 1 using System;
 2 using Xamarin.Forms;
 3 using Xamarin.Forms.Xaml;
 4 using System.Windows.Input;
 5 
 6 namespace MyApp.Extensions
 7 {
 8     [ContentProperty("Command")]
 9     public class CommandExtension : BindableObject, IMarkupExtension
10     {
11         public string Command { get; set; }
12 
13         // Binding source for Command
14         public object Source { get; set; }
15 
16         // CommandParameter
17         public object Parameter { get; set; }
18 
19         public object ProvideValue(IServiceProvider serviceProvider)
20         {
21             return this;
22         }
23     }
24 }
 1 using Xamarin.Forms;
 2 using System.Linq;
 3 
 4 namespace MyApp.Extensions
 5 {
 6     public class Gestures
 7     {
 8         #region TapCommand
 9 
10         public static readonly BindableProperty TapCommandProperty = 
11             BindableProperty.CreateAttached<Gestures, CommandExtension>(
12               x => (CommandExtension)x.GetValue(Gestures.TapCommandProperty), 
13               null, BindingMode.OneWay, propertyChanged: TapCommandChanged);
14 
15         #endregion
16 
17         private static void TapCommandChanged(BindableObject source, CommandExtension oldVal, 
18                                               CommandExtension newVal)
19         {
20             var tapGesture = new TapGestureRecognizer();
21             
22             // Set command
23             var commandBinding = new Binding(newVal.Command, source: newVal.Source);
24             tapGesture.SetBinding(TapGestureRecognizer.CommandProperty, commandBinding);
25             
26             // Set command parameter
27             if (newVal.Parameter is Binding)
28             {
29                 tapGesture.SetBinding(TapGestureRecognizer.CommandParameterProperty, 
30                                       newVal.Parameter as Binding);
31             }
32             else
33             {
34                 tapGesture.CommandParameter = newVal.Parameter;
35             }
36             
37             // Remove old TapGestureRecognizer
38             var view = source as View;
39             var toRemove = view.GestureRecognizers.OfType<TapGestureRecognizer>().FirstOrDefault();
40             view.GestureRecognizers.Remove(toRemove);
41 
42             // Add new one
43             view.GestureRecognizers.Add(tapGesture);
44         }
45     }
46 }

 

Xamarin.Forms 自定义 TapGestureRecognizer 附加属性

标签:add   ini   cat   string   custom   any   move   res   ice   

原文地址:https://www.cnblogs.com/mschen/p/10565231.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!