summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Xamarin.Forms.Core.UnitTests/ButtonUnitTest.cs28
-rw-r--r--Xamarin.Forms.Core/Button.cs21
-rw-r--r--Xamarin.Forms.Core/IButtonController.cs2
-rw-r--r--Xamarin.Forms.Platform.Android/AppCompat/ButtonRenderer.cs38
-rw-r--r--Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs26
-rw-r--r--Xamarin.Forms.Platform.WP8/ButtonRenderer.cs13
-rw-r--r--Xamarin.Forms.Platform.WinRT/ButtonRenderer.cs16
-rw-r--r--Xamarin.Forms.Platform.iOS/Renderers/ButtonRenderer.cs10
-rw-r--r--docs/Xamarin.Forms.Core/Xamarin.Forms/Button.xml70
-rw-r--r--docs/Xamarin.Forms.Core/Xamarin.Forms/IButtonController.xml32
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&lt;Xamarin.Forms.Button&gt;" />
- <TypeSignature Language="ILAsm" Value=".class public auto ansi beforefieldinit Button extends Xamarin.Forms.View implements class Xamarin.Forms.IButtonController, class Xamarin.Forms.IElementConfiguration`1&lt;class Xamarin.Forms.Button&gt;, 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&lt;Xamarin.Forms.Button&gt;, 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&lt;class Xamarin.Forms.Button&gt;, 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&lt;Xamarin.Forms.Button&gt;</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>