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