Browse Source

Enable adding event handlers to Gestures events.

Added the `Add*Handler` and `Remove*Handler`  events required by XAML in order to use attached event syntax. Added unit test to ensure this works.
pull/2951/head
Steven Kirk 7 years ago
parent
commit
0eb7b2d25e
  1. 30
      src/Avalonia.Input/Gestures.cs
  2. 46
      tests/Avalonia.Markup.Xaml.UnitTests/Xaml/EventTests.cs

30
src/Avalonia.Input/Gestures.cs

@ -39,6 +39,36 @@ namespace Avalonia.Input
InputElement.PointerReleasedEvent.RouteFinished.Subscribe(PointerReleased); InputElement.PointerReleasedEvent.RouteFinished.Subscribe(PointerReleased);
} }
public static void AddTappedHandler(IInteractive element, EventHandler<RoutedEventArgs> handler)
{
element.AddHandler(TappedEvent, handler);
}
public static void AddDoubleTappedHandler(IInteractive element, EventHandler<RoutedEventArgs> handler)
{
element.AddHandler(DoubleTappedEvent, handler);
}
public static void AddRightTappedHandler(IInteractive element, EventHandler<RoutedEventArgs> handler)
{
element.AddHandler(RightTappedEvent, handler);
}
public static void RemoveTappedHandler(IInteractive element, EventHandler<RoutedEventArgs> handler)
{
element.RemoveHandler(TappedEvent, handler);
}
public static void RemoveDoubleTappedHandler(IInteractive element, EventHandler<RoutedEventArgs> handler)
{
element.RemoveHandler(DoubleTappedEvent, handler);
}
public static void RemoveRightTappedHandler(IInteractive element, EventHandler<RoutedEventArgs> handler)
{
element.RemoveHandler(RightTappedEvent, handler);
}
private static void PointerPressed(RoutedEventArgs ev) private static void PointerPressed(RoutedEventArgs ev)
{ {
if (ev.Route == RoutingStrategies.Bubble) if (ev.Route == RoutingStrategies.Bubble)

46
tests/Avalonia.Markup.Xaml.UnitTests/Xaml/EventTests.cs

@ -1,7 +1,6 @@
// Copyright (c) The Avalonia Project. All rights reserved. // Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information. // Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Interactivity; using Avalonia.Interactivity;
@ -12,45 +11,56 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
public class EventTests : XamlTestBase public class EventTests : XamlTestBase
{ {
[Fact] [Fact]
public void Event_Is_Attached() public void Event_Is_Assigned()
{ {
var xaml = @"<Button xmlns='https://github.com/avaloniaui' Click='OnClick'/>"; var xaml = @"<Button xmlns='https://github.com/avaloniaui' Click='OnClick'/>";
var loader = new AvaloniaXamlLoader(); var loader = new AvaloniaXamlLoader();
var target = new MyButton(); var target = new MyButton();
loader.Load(xaml, rootInstance: target); loader.Load(xaml, rootInstance: target);
RaiseClick(target);
Assert.True(target.Clicked); target.RaiseEvent(new RoutedEventArgs
{
RoutedEvent = Button.ClickEvent,
});
Assert.True(target.WasClicked);
} }
[Fact] [Fact]
public void Exception_Is_Thrown_If_Event_Not_Found() public void Attached_Event_Is_Assigned()
{ {
var xaml = @"<Button xmlns='https://github.com/avaloniaui' Click='NotFound'/>"; var xaml = @"<Button xmlns='https://github.com/avaloniaui' Gestures.Tapped='OnTapped'/>";
var loader = new AvaloniaXamlLoader(); var loader = new AvaloniaXamlLoader();
var target = new MyButton(); var target = new MyButton();
XamlTestHelpers.AssertThrowsXamlException(() => loader.Load(xaml, rootInstance: target)); loader.Load(xaml, rootInstance: target);
}
private void RaiseClick(MyButton target) target.RaiseEvent(new RoutedEventArgs
{
target.RaiseEvent(new KeyEventArgs
{ {
RoutedEvent = Button.KeyDownEvent, RoutedEvent = Gestures.TappedEvent,
Key = Key.Enter,
}); });
Assert.True(target.WasTapped);
}
[Fact]
public void Exception_Is_Thrown_If_Event_Not_Found()
{
var xaml = @"<Button xmlns='https://github.com/avaloniaui' Click='NotFound'/>";
var loader = new AvaloniaXamlLoader();
var target = new MyButton();
XamlTestHelpers.AssertThrowsXamlException(() => loader.Load(xaml, rootInstance: target));
} }
public class MyButton : Button public class MyButton : Button
{ {
public bool Clicked { get; private set; } public bool WasClicked { get; private set; }
public bool WasTapped { get; private set; }
public void OnClick(object sender, RoutedEventArgs e) public void OnClick(object sender, RoutedEventArgs e) => WasClicked = true;
{ public void OnTapped(object sender, RoutedEventArgs e) => WasTapped = true;
Clicked = true;
}
} }
} }
} }

Loading…
Cancel
Save