}
[Test]
- public void TestTappedEvent ()
+ public void TestClickedvent ()
{
var view = new Button ();
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();
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
public event EventHandler Clicked;
+ public event EventHandler Pressed;
+
+ public event EventHandler Released;
+
public Button()
{
_platformConfigurationRegistry = new Lazy<PlatformConfigurationRegistry<Button>>(() => new PlatformConfigurationRegistry<Button>(this));
public interface IButtonController : IViewController
{
void SendClicked();
+ void SendPressed();
+ void SendReleased();
}
}
\ No newline at end of file
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;
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)
{
}
if (Control != null)
{
Control.SetOnClickListener(null);
+ Control.SetOnTouchListener(null);
Control.RemoveOnAttachStateChangeListener(this);
Control.Tag = null;
_textColorSwitcher = null;
AppCompatButton button = CreateNativeControl();
button.SetOnClickListener(ButtonClickListener.Instance.Value);
+ button.SetOnTouchListener(ButtonTouchListener.Instance.Value);
button.Tag = this;
_textColorSwitcher = new TextColorSwitcher(button.TextColors);
SetNativeControl(button);
#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
+}
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
{
button = CreateNativeControl();
button.SetOnClickListener(ButtonClickListener.Instance.Value);
+ button.SetOnTouchListener(ButtonTouchListener.Instance.Value);
button.Tag = this;
SetNativeControl(button);
_textColorSwitcher = new TextColorSwitcher(button.TextColors);
((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
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;
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();
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()
-using System;
+using System;
using System.ComponentModel;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
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
{
var button = new FormsButton();
button.Click += OnButtonClick;
+ button.AddHandler(PointerPressedEvent, new PointerEventHandler(OnPointerPressed), true);
SetNativeControl(button);
}
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"];
}
protected override void Dispose(bool disposing)
{
if (Control != null)
+ {
Control.TouchUpInside -= OnButtonTouchUpInside;
+ Control.TouchDown -= OnButtonTouchDown;
+ }
base.Dispose(disposing);
}
_buttonTextColorDefaultDisabled = Control.TitleColor(UIControlState.Disabled);
Control.TouchUpInside += OnButtonTouchUpInside;
+ Control.TouchDown += OnButtonTouchDown;
}
UpdateText();
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;
<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>
<Interface>
<InterfaceName>Xamarin.Forms.IElementConfiguration<Xamarin.Forms.Button></InterfaceName>
</Interface>
+ <Interface>
+ <InterfaceName>Xamarin.Forms.IFontElement</InterfaceName>
+ </Interface>
</Interfaces>
<Attributes>
<Attribute>
<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" />
<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>
<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>