2 changed files with 70 additions and 0 deletions
@ -0,0 +1,33 @@ |
|||||
|
using Avalonia.Interactivity; |
||||
|
using Avalonia.Input; |
||||
|
|
||||
|
namespace Avalonia.Controls.Mixins |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Adds pressed functionality to control classes.
|
||||
|
///
|
||||
|
/// Adds the ':pressed' class when the item is pressed.
|
||||
|
/// </summary>
|
||||
|
public static class PressedMixin |
||||
|
{ |
||||
|
private static void HandlePointerPressed<TControl>(TControl sender, PointerPressedEventArgs e) where TControl : Control |
||||
|
{ |
||||
|
if (e.GetCurrentPoint(sender).Properties.IsLeftButtonPressed) |
||||
|
{ |
||||
|
((IPseudoClasses)sender.Classes).Set(":pressed", true); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private static void HandlePointerReleased<TControl>(TControl sender) where TControl : Control |
||||
|
{ |
||||
|
((IPseudoClasses)sender.Classes).Set(":pressed", false); |
||||
|
} |
||||
|
|
||||
|
public static void Attach<TControl>() where TControl : Control |
||||
|
{ |
||||
|
InputElement.PointerPressedEvent.AddClassHandler<TControl>((x, e) => HandlePointerPressed(x, e), RoutingStrategies.Tunnel, true); |
||||
|
InputElement.PointerReleasedEvent.AddClassHandler<TControl>((x, e) => HandlePointerReleased(x), RoutingStrategies.Tunnel, true); |
||||
|
InputElement.PointerCaptureLostEvent.AddClassHandler<TControl>((x, e) => HandlePointerReleased(x), RoutingStrategies.Tunnel, true); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,37 @@ |
|||||
|
using Avalonia.Controls.Mixins; |
||||
|
using Avalonia.UnitTests; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Avalonia.Controls.UnitTests.Mixins |
||||
|
{ |
||||
|
public class PressedMixinTests |
||||
|
{ |
||||
|
private MouseTestHelper _mouse = new MouseTestHelper(); |
||||
|
|
||||
|
[Fact] |
||||
|
public void Selected_Class_Should_Not_Initially_Be_Added() |
||||
|
{ |
||||
|
var target = new TestControl(); |
||||
|
|
||||
|
Assert.Empty(target.Classes); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Setting_IsSelected_Should_Add_Selected_Class() |
||||
|
{ |
||||
|
var target = new TestControl(); |
||||
|
|
||||
|
_mouse.Down(target); |
||||
|
|
||||
|
Assert.Equal(new[] { ":pressed" }, target.Classes); |
||||
|
} |
||||
|
|
||||
|
private class TestControl : Control |
||||
|
{ |
||||
|
static TestControl() |
||||
|
{ |
||||
|
PressedMixin.Attach<TestControl>(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue