diff options
-rw-r--r-- | Xamarin.Forms.Core.UnitTests/ButtonUnitTest.cs | 28 | ||||
-rw-r--r-- | Xamarin.Forms.Core/Button.cs | 21 | ||||
-rw-r--r-- | Xamarin.Forms.Core/IButtonController.cs | 2 | ||||
-rw-r--r-- | Xamarin.Forms.Platform.Android/AppCompat/ButtonRenderer.cs | 38 | ||||
-rw-r--r-- | Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs | 26 | ||||
-rw-r--r-- | Xamarin.Forms.Platform.WP8/ButtonRenderer.cs | 13 | ||||
-rw-r--r-- | Xamarin.Forms.Platform.WinRT/ButtonRenderer.cs | 16 | ||||
-rw-r--r-- | Xamarin.Forms.Platform.iOS/Renderers/ButtonRenderer.cs | 10 | ||||
-rw-r--r-- | docs/Xamarin.Forms.Core/Xamarin.Forms/Button.xml | 70 | ||||
-rw-r--r-- | docs/Xamarin.Forms.Core/Xamarin.Forms/IButtonController.xml | 32 |
10 files changed, 234 insertions, 22 deletions
diff --git a/Xamarin.Forms.Core.UnitTests/ButtonUnitTest.cs b/Xamarin.Forms.Core.UnitTests/ButtonUnitTest.cs index d590f8c3..eef9dfc9 100644 --- a/Xamarin.Forms.Core.UnitTests/ButtonUnitTest.cs +++ b/Xamarin.Forms.Core.UnitTests/ButtonUnitTest.cs @@ -35,7 +35,7 @@ namespace Xamarin.Forms.Core.UnitTests } [Test] - public void TestTappedEvent () + public void TestClickedvent () { var view = new Button (); @@ -47,6 +47,32 @@ namespace Xamarin.Forms.Core.UnitTests Assert.True (activated); } + [Test] + public void TestPressedEvent () + { + var view = new Button(); + + bool pressed = false; + view.Pressed += (sender, e) => pressed = true; + + ((IButtonController)view).SendPressed(); + + Assert.True(pressed); + } + + [Test] + public void TestReleasedEvent () + { + var view = new Button(); + + bool released = false; + view.Released += (sender, e) => released = true; + + ((IButtonController)view).SendReleased(); + + Assert.True(released); + } + protected override Button CreateSource() { return new Button(); diff --git a/Xamarin.Forms.Core/Button.cs b/Xamarin.Forms.Core/Button.cs index 97d774c9..bcd593ed 100644 --- a/Xamarin.Forms.Core/Button.cs +++ b/Xamarin.Forms.Core/Button.cs @@ -116,13 +116,18 @@ namespace Xamarin.Forms void IButtonController.SendClicked() { - ICommand cmd = Command; - if (cmd != null) - cmd.Execute(CommandParameter); + Command?.Execute(CommandParameter); + Clicked?.Invoke(this, EventArgs.Empty); + } - EventHandler handler = Clicked; - if (handler != null) - handler(this, EventArgs.Empty); + void IButtonController.SendPressed() + { + Pressed?.Invoke(this, EventArgs.Empty); + } + + void IButtonController.SendReleased() + { + Released?.Invoke(this, EventArgs.Empty); } public FontAttributes FontAttributes @@ -146,6 +151,10 @@ namespace Xamarin.Forms public event EventHandler Clicked; + public event EventHandler Pressed; + + public event EventHandler Released; + public Button() { _platformConfigurationRegistry = new Lazy<PlatformConfigurationRegistry<Button>>(() => new PlatformConfigurationRegistry<Button>(this)); diff --git a/Xamarin.Forms.Core/IButtonController.cs b/Xamarin.Forms.Core/IButtonController.cs index c88907b0..b7e3bc41 100644 --- a/Xamarin.Forms.Core/IButtonController.cs +++ b/Xamarin.Forms.Core/IButtonController.cs @@ -3,5 +3,7 @@ namespace Xamarin.Forms public interface IButtonController : IViewController { void SendClicked(); + void SendPressed(); + void SendReleased(); } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.Android/AppCompat/ButtonRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/ButtonRenderer.cs index 4c33df85..aef56e11 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/ButtonRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/ButtonRenderer.cs @@ -9,11 +9,14 @@ using Android.Support.V7.Widget; using Android.Util; using GlobalResource = Android.Resource; using Object = Java.Lang.Object; +using AView = Android.Views.View; +using AMotionEvent = Android.Views.MotionEvent; +using AMotionEventActions = Android.Views.MotionEventActions; using static System.String; namespace Xamarin.Forms.Platform.Android.AppCompat { - public class ButtonRenderer : ViewRenderer<Button, AppCompatButton>, global::Android.Views.View.IOnAttachStateChangeListener + public class ButtonRenderer : ViewRenderer<Button, AppCompatButton>, AView.IOnAttachStateChangeListener { TextColorSwitcher _textColorSwitcher; float _defaultFontSize; @@ -28,12 +31,12 @@ namespace Xamarin.Forms.Platform.Android.AppCompat global::Android.Widget.Button NativeButton => Control; - void IOnAttachStateChangeListener.OnViewAttachedToWindow(global::Android.Views.View attachedView) + void IOnAttachStateChangeListener.OnViewAttachedToWindow(AView attachedView) { UpdateText(); } - void IOnAttachStateChangeListener.OnViewDetachedFromWindow(global::Android.Views.View detachedView) + void IOnAttachStateChangeListener.OnViewDetachedFromWindow(AView detachedView) { } @@ -74,6 +77,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat if (Control != null) { Control.SetOnClickListener(null); + Control.SetOnTouchListener(null); Control.RemoveOnAttachStateChangeListener(this); Control.Tag = null; _textColorSwitcher = null; @@ -98,6 +102,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat AppCompatButton button = CreateNativeControl(); button.SetOnClickListener(ButtonClickListener.Instance.Value); + button.SetOnTouchListener(ButtonTouchListener.Instance.Value); button.Tag = this; _textColorSwitcher = new TextColorSwitcher(button.TextColors); SetNativeControl(button); @@ -292,11 +297,34 @@ namespace Xamarin.Forms.Platform.Android.AppCompat #endregion - public void OnClick(global::Android.Views.View v) + public void OnClick(AView v) { var renderer = v.Tag as ButtonRenderer; ((IButtonController)renderer?.Element)?.SendClicked(); } } + + class ButtonTouchListener : Object, IOnTouchListener + { + public static readonly Lazy<ButtonTouchListener> Instance = new Lazy<ButtonTouchListener>(() => new ButtonTouchListener()); + + public bool OnTouch(AView v, AMotionEvent e) + { + var renderer = v.Tag as ButtonRenderer; + if (renderer != null) + { + var buttonController = renderer.Element as IButtonController; + if (e.Action == AMotionEventActions.Down) + { + buttonController?.SendPressed(); + } + else if (e.Action == AMotionEventActions.Up) + { + buttonController?.SendReleased(); + } + } + return false; + } + } } -}
\ No newline at end of file +} diff --git a/Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs index 4f384b3b..e07a2be5 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs @@ -7,6 +7,8 @@ using Android.Util; using static System.String; using AButton = Android.Widget.Button; using AView = Android.Views.View; +using AMotionEvent = Android.Views.MotionEvent; +using AMotionEventActions = Android.Views.MotionEventActions; using Object = Java.Lang.Object; namespace Xamarin.Forms.Platform.Android @@ -96,6 +98,7 @@ namespace Xamarin.Forms.Platform.Android { button = CreateNativeControl(); button.SetOnClickListener(ButtonClickListener.Instance.Value); + button.SetOnTouchListener(ButtonTouchListener.Instance.Value); button.Tag = this; SetNativeControl(button); _textColorSwitcher = new TextColorSwitcher(button.TextColors); @@ -303,5 +306,28 @@ namespace Xamarin.Forms.Platform.Android ((IButtonController)renderer.Element).SendClicked(); } } + + class ButtonTouchListener : Object, IOnTouchListener + { + public static readonly Lazy<ButtonTouchListener> Instance = new Lazy<ButtonTouchListener>(() => new ButtonTouchListener()); + + public bool OnTouch(AView v, AMotionEvent e) + { + var renderer = v.Tag as ButtonRenderer; + if (renderer != null) + { + var buttonController = renderer.Element as IButtonController; + if (e.Action == AMotionEventActions.Down) + { + buttonController?.SendPressed(); + } + else if (e.Action == AMotionEventActions.Up) + { + buttonController?.SendReleased(); + } + } + return false; + } + } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.WP8/ButtonRenderer.cs b/Xamarin.Forms.Platform.WP8/ButtonRenderer.cs index a84a3db6..e44d244c 100644 --- a/Xamarin.Forms.Platform.WP8/ButtonRenderer.cs +++ b/Xamarin.Forms.Platform.WP8/ButtonRenderer.cs @@ -2,6 +2,7 @@ using System.ComponentModel; using System.Windows; using System.Windows.Controls; +using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using Xamarin.Forms.Internals; @@ -20,7 +21,9 @@ namespace Xamarin.Forms.Platform.WinPhone base.OnElementChanged(e); var button = new WButton(); + button.ClickMode = ClickMode.Press; button.Click += HandleButtonClick; + button.AddHandler(UIElement.TapEvent, new EventHandler<GestureEventArgs>(HandleButtonTap), true); SetNativeControl(button); UpdateContent(); @@ -60,9 +63,13 @@ namespace Xamarin.Forms.Platform.WinPhone void HandleButtonClick(object sender, RoutedEventArgs e) { - Button buttonView = Element; - if (buttonView != null) - ((IButtonController)buttonView).SendClicked(); + ((IButtonController)Element)?.SendPressed(); + } + + void HandleButtonTap(object sender, GestureEventArgs e) + { + ((IButtonController)Element)?.SendReleased(); + ((IButtonController)Element)?.SendClicked(); } void UpdateBackground() diff --git a/Xamarin.Forms.Platform.WinRT/ButtonRenderer.cs b/Xamarin.Forms.Platform.WinRT/ButtonRenderer.cs index aff11963..acc41db3 100644 --- a/Xamarin.Forms.Platform.WinRT/ButtonRenderer.cs +++ b/Xamarin.Forms.Platform.WinRT/ButtonRenderer.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.ComponentModel; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; @@ -8,6 +8,7 @@ using Xamarin.Forms.Internals; using WThickness = Windows.UI.Xaml.Thickness; using WButton = Windows.UI.Xaml.Controls.Button; using WImage = Windows.UI.Xaml.Controls.Image; +using Windows.UI.Xaml.Input; #if WINDOWS_UWP @@ -31,6 +32,7 @@ namespace Xamarin.Forms.Platform.WinRT { var button = new FormsButton(); button.Click += OnButtonClick; + button.AddHandler(PointerPressedEvent, new PointerEventHandler(OnPointerPressed), true); SetNativeControl(button); } @@ -99,12 +101,16 @@ namespace Xamarin.Forms.Platform.WinRT void OnButtonClick(object sender, RoutedEventArgs e) { - Button buttonView = Element; - if (buttonView != null) - ((IButtonController)buttonView).SendClicked(); + ((IButtonController)Element)?.SendReleased(); + ((IButtonController)Element)?.SendClicked(); } - void UpdateBackground() + void OnPointerPressed(object sender, RoutedEventArgs e) + { + ((IButtonController)Element)?.SendPressed(); + } + + void UpdateBackground() { Control.BackgroundColor = Element.BackgroundColor != Color.Default ? Element.BackgroundColor.ToBrush() : (Brush)Windows.UI.Xaml.Application.Current.Resources["ButtonBackgroundThemeBrush"]; } diff --git a/Xamarin.Forms.Platform.iOS/Renderers/ButtonRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/ButtonRenderer.cs index 3e99cd5d..5eb9b777 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/ButtonRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/ButtonRenderer.cs @@ -38,7 +38,10 @@ namespace Xamarin.Forms.Platform.iOS protected override void Dispose(bool disposing) { if (Control != null) + { Control.TouchUpInside -= OnButtonTouchUpInside; + Control.TouchDown -= OnButtonTouchDown; + } base.Dispose(disposing); } @@ -60,6 +63,7 @@ namespace Xamarin.Forms.Platform.iOS _buttonTextColorDefaultDisabled = Control.TitleColor(UIControlState.Disabled); Control.TouchUpInside += OnButtonTouchUpInside; + Control.TouchDown += OnButtonTouchDown; } UpdateText(); @@ -103,9 +107,15 @@ namespace Xamarin.Forms.Platform.iOS void OnButtonTouchUpInside(object sender, EventArgs eventArgs) { + ((IButtonController)Element)?.SendReleased(); ((IButtonController)Element)?.SendClicked(); } + void OnButtonTouchDown(object sender, EventArgs eventArgs) + { + ((IButtonController)Element)?.SendPressed(); + } + void UpdateBorder() { var uiButton = Control; diff --git a/docs/Xamarin.Forms.Core/Xamarin.Forms/Button.xml b/docs/Xamarin.Forms.Core/Xamarin.Forms/Button.xml index ba243413..3df8f8fc 100644 --- a/docs/Xamarin.Forms.Core/Xamarin.Forms/Button.xml +++ b/docs/Xamarin.Forms.Core/Xamarin.Forms/Button.xml @@ -1,6 +1,6 @@ <Type Name="Button" FullName="Xamarin.Forms.Button"> - <TypeSignature Language="C#" Value="public class Button : Xamarin.Forms.View, Xamarin.Forms.IButtonController, Xamarin.Forms.IElementConfiguration<Xamarin.Forms.Button>" /> - <TypeSignature Language="ILAsm" Value=".class public auto ansi beforefieldinit Button extends Xamarin.Forms.View implements class Xamarin.Forms.IButtonController, class Xamarin.Forms.IElementConfiguration`1<class Xamarin.Forms.Button>, class Xamarin.Forms.IElementController, class Xamarin.Forms.IViewController, class Xamarin.Forms.IVisualElementController" /> + <TypeSignature Language="C#" Value="public class Button : Xamarin.Forms.View, Xamarin.Forms.IButtonController, Xamarin.Forms.IElementConfiguration<Xamarin.Forms.Button>, Xamarin.Forms.IFontElement" /> + <TypeSignature Language="ILAsm" Value=".class public auto ansi beforefieldinit Button extends Xamarin.Forms.View implements class Xamarin.Forms.IButtonController, class Xamarin.Forms.IElementConfiguration`1<class Xamarin.Forms.Button>, class Xamarin.Forms.IElementController, class Xamarin.Forms.IFontElement, class Xamarin.Forms.IViewController, class Xamarin.Forms.IVisualElementController" /> <AssemblyInfo> <AssemblyName>Xamarin.Forms.Core</AssemblyName> <AssemblyVersion>1.0.0.0</AssemblyVersion> @@ -21,6 +21,9 @@ <Interface> <InterfaceName>Xamarin.Forms.IElementConfiguration<Xamarin.Forms.Button></InterfaceName> </Interface> + <Interface> + <InterfaceName>Xamarin.Forms.IFontElement</InterfaceName> + </Interface> </Interfaces> <Attributes> <Attribute> @@ -669,6 +672,37 @@ namespace FormsGallery <remarks>A Button triggers this by itself. An inheritor only need to call this for properties without BindableProperty as backend store.</remarks> </Docs> </Member> + <Member MemberName="Pressed"> + <MemberSignature Language="C#" Value="public event EventHandler Pressed;" /> + <MemberSignature Language="ILAsm" Value=".event class System.EventHandler Pressed" /> + <MemberType>Event</MemberType> + <AssemblyInfo> + <AssemblyVersion>2.0.0.0</AssemblyVersion> + </AssemblyInfo> + <ReturnValue> + <ReturnType>System.EventHandler</ReturnType> + </ReturnValue> + <Docs> + <summary>Occurs when the Button is pressed.</summary> + <remarks> + </remarks> + </Docs> + </Member> + <Member MemberName="Released"> + <MemberSignature Language="C#" Value="public event EventHandler Released;" /> + <MemberSignature Language="ILAsm" Value=".event class System.EventHandler Released" /> + <MemberType>Event</MemberType> + <AssemblyInfo> + <AssemblyVersion>2.0.0.0</AssemblyVersion> + </AssemblyInfo> + <ReturnValue> + <ReturnType>System.EventHandler</ReturnType> + </ReturnValue> + <Docs> + <summary>Occurs when the Button is released.</summary> + <remarks>The released event always occur before the clicked event.</remarks> + </Docs> + </Member> <Member MemberName="Text"> <MemberSignature Language="C#" Value="public string Text { get; set; }" /> <MemberSignature Language="ILAsm" Value=".property instance string Text" /> @@ -777,5 +811,37 @@ namespace FormsGallery <remarks>To be added.</remarks> </Docs> </Member> + <Member MemberName="Xamarin.Forms.IButtonController.SendPressed"> + <MemberSignature Language="C#" Value="void IButtonController.SendPressed ();" /> + <MemberSignature Language="ILAsm" Value=".method hidebysig newslot virtual instance void Xamarin.Forms.IButtonController.SendPressed() cil managed" /> + <MemberType>Method</MemberType> + <AssemblyInfo> + <AssemblyVersion>2.0.0.0</AssemblyVersion> + </AssemblyInfo> + <ReturnValue> + <ReturnType>System.Void</ReturnType> + </ReturnValue> + <Parameters /> + <Docs> + <summary>Sends a press event.</summary> + <remarks>To be added.</remarks> + </Docs> + </Member> + <Member MemberName="Xamarin.Forms.IButtonController.SendReleased"> + <MemberSignature Language="C#" Value="void IButtonController.SendReleased ();" /> + <MemberSignature Language="ILAsm" Value=".method hidebysig newslot virtual instance void Xamarin.Forms.IButtonController.SendReleased() cil managed" /> + <MemberType>Method</MemberType> + <AssemblyInfo> + <AssemblyVersion>2.0.0.0</AssemblyVersion> + </AssemblyInfo> + <ReturnValue> + <ReturnType>System.Void</ReturnType> + </ReturnValue> + <Parameters /> + <Docs> + <summary>Sends a release event.</summary> + <remarks>To be added.</remarks> + </Docs> + </Member> </Members> </Type> diff --git a/docs/Xamarin.Forms.Core/Xamarin.Forms/IButtonController.xml b/docs/Xamarin.Forms.Core/Xamarin.Forms/IButtonController.xml index 2b66481b..6e4e1c20 100644 --- a/docs/Xamarin.Forms.Core/Xamarin.Forms/IButtonController.xml +++ b/docs/Xamarin.Forms.Core/Xamarin.Forms/IButtonController.xml @@ -31,5 +31,37 @@ <remarks>To be added.</remarks> </Docs> </Member> + <Member MemberName="SendPressed"> + <MemberSignature Language="C#" Value="public void SendPressed ();" /> + <MemberSignature Language="ILAsm" Value=".method public hidebysig newslot virtual instance void SendPressed() cil managed" /> + <MemberType>Method</MemberType> + <AssemblyInfo> + <AssemblyVersion>2.0.0.0</AssemblyVersion> + </AssemblyInfo> + <ReturnValue> + <ReturnType>System.Void</ReturnType> + </ReturnValue> + <Parameters /> + <Docs> + <summary>To be added.</summary> + <remarks>To be added.</remarks> + </Docs> + </Member> + <Member MemberName="SendReleased"> + <MemberSignature Language="C#" Value="public void SendReleased ();" /> + <MemberSignature Language="ILAsm" Value=".method public hidebysig newslot virtual instance void SendReleased() cil managed" /> + <MemberType>Method</MemberType> + <AssemblyInfo> + <AssemblyVersion>2.0.0.0</AssemblyVersion> + </AssemblyInfo> + <ReturnValue> + <ReturnType>System.Void</ReturnType> + </ReturnValue> + <Parameters /> + <Docs> + <summary>To be added.</summary> + <remarks>To be added.</remarks> + </Docs> + </Member> </Members> </Type> |