diff --git a/src/Avalonia.Controls/Mixins/PressedMixin.cs b/src/Avalonia.Controls/Mixins/PressedMixin.cs
new file mode 100644
index 0000000000..01b0a8564f
--- /dev/null
+++ b/src/Avalonia.Controls/Mixins/PressedMixin.cs
@@ -0,0 +1,33 @@
+using Avalonia.Interactivity;
+using Avalonia.Input;
+
+namespace Avalonia.Controls.Mixins
+{
+ ///
+ /// Adds pressed functionality to control classes.
+ ///
+ /// Adds the ':pressed' class when the item is pressed.
+ ///
+ public static class PressedMixin
+ {
+ private static void HandlePointerPressed(TControl sender, PointerPressedEventArgs e) where TControl : Control
+ {
+ if (e.GetCurrentPoint(sender).Properties.IsLeftButtonPressed)
+ {
+ ((IPseudoClasses)sender.Classes).Set(":pressed", true);
+ }
+ }
+
+ private static void HandlePointerReleased(TControl sender) where TControl : Control
+ {
+ ((IPseudoClasses)sender.Classes).Set(":pressed", false);
+ }
+
+ public static void Attach() where TControl : Control
+ {
+ InputElement.PointerPressedEvent.AddClassHandler((x, e) => HandlePointerPressed(x, e), RoutingStrategies.Tunnel, true);
+ InputElement.PointerReleasedEvent.AddClassHandler((x, e) => HandlePointerReleased(x), RoutingStrategies.Tunnel, true);
+ InputElement.PointerCaptureLostEvent.AddClassHandler((x, e) => HandlePointerReleased(x), RoutingStrategies.Tunnel, true);
+ }
+ }
+}
diff --git a/tests/Avalonia.Controls.UnitTests/Mixins/PressedMixinTests.cs b/tests/Avalonia.Controls.UnitTests/Mixins/PressedMixinTests.cs
new file mode 100644
index 0000000000..0ff1f40121
--- /dev/null
+++ b/tests/Avalonia.Controls.UnitTests/Mixins/PressedMixinTests.cs
@@ -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();
+ }
+ }
+ }
+}