Skip to content

Commit f94930a

Browse files
committed
Add pointer event triggers
1 parent 9feb9d1 commit f94930a

7 files changed

+336
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System.Reactive.Disposables;
2+
using Avalonia.Input;
3+
using Avalonia.Interactivity;
4+
using Avalonia.Xaml.Interactivity;
5+
6+
namespace Avalonia.Xaml.Interactions.Custom;
7+
8+
/// <summary>
9+
///
10+
/// </summary>
11+
public class PointerCaptureLostTrigger : RoutedEventTriggerBase
12+
{
13+
/// <summary>
14+
///
15+
/// </summary>
16+
public bool MarkAsHandled { get; set; }
17+
18+
/// <summary>
19+
///
20+
/// </summary>
21+
/// <param name="disposables"></param>
22+
protected override void OnAttached(CompositeDisposable disposables)
23+
{
24+
if (AssociatedObject is InputElement element)
25+
{
26+
var disposable = element.AddDisposableHandler(
27+
InputElement.PointerCaptureLostEvent,
28+
OnPointerCaptureLost,
29+
EventRoutingStrategy);
30+
disposables.Add(disposable);
31+
}
32+
}
33+
34+
private void OnPointerCaptureLost(object? sender, PointerCaptureLostEventArgs e)
35+
{
36+
if (!IsEnabled)
37+
{
38+
return;
39+
}
40+
41+
e.Handled = MarkAsHandled;
42+
Interaction.ExecuteActions(AssociatedObject, Actions, e);
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System.Reactive.Disposables;
2+
using Avalonia.Input;
3+
using Avalonia.Interactivity;
4+
using Avalonia.Xaml.Interactivity;
5+
6+
namespace Avalonia.Xaml.Interactions.Custom;
7+
8+
/// <summary>
9+
///
10+
/// </summary>
11+
public class PointerEnteredTrigger : RoutedEventTriggerBase
12+
{
13+
/// <summary>
14+
///
15+
/// </summary>
16+
public bool MarkAsHandled { get; set; }
17+
18+
/// <summary>
19+
///
20+
/// </summary>
21+
/// <param name="disposables"></param>
22+
protected override void OnAttached(CompositeDisposable disposables)
23+
{
24+
if (AssociatedObject is InputElement element)
25+
{
26+
var disposable = element.AddDisposableHandler(
27+
InputElement.PointerEnteredEvent,
28+
OnPointerEntered,
29+
EventRoutingStrategy);
30+
disposables.Add(disposable);
31+
}
32+
}
33+
34+
private void OnPointerEntered(object? sender, PointerEventArgs e)
35+
{
36+
if (!IsEnabled)
37+
{
38+
return;
39+
}
40+
41+
e.Handled = MarkAsHandled;
42+
Interaction.ExecuteActions(AssociatedObject, Actions, e);
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System.Reactive.Disposables;
2+
using Avalonia.Input;
3+
using Avalonia.Interactivity;
4+
using Avalonia.Xaml.Interactivity;
5+
6+
namespace Avalonia.Xaml.Interactions.Custom;
7+
8+
/// <summary>
9+
///
10+
/// </summary>
11+
public class PointerExitedTrigger : RoutedEventTriggerBase
12+
{
13+
/// <summary>
14+
///
15+
/// </summary>
16+
public bool MarkAsHandled { get; set; }
17+
18+
/// <summary>
19+
///
20+
/// </summary>
21+
/// <param name="disposables"></param>
22+
protected override void OnAttached(CompositeDisposable disposables)
23+
{
24+
if (AssociatedObject is InputElement element)
25+
{
26+
var disposable = element.AddDisposableHandler(
27+
InputElement.PointerExitedEvent,
28+
OnPointerExited,
29+
EventRoutingStrategy);
30+
disposables.Add(disposable);
31+
}
32+
}
33+
34+
private void OnPointerExited(object? sender, PointerEventArgs e)
35+
{
36+
if (!IsEnabled)
37+
{
38+
return;
39+
}
40+
41+
e.Handled = MarkAsHandled;
42+
Interaction.ExecuteActions(AssociatedObject, Actions, e);
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System.Reactive.Disposables;
2+
using Avalonia.Input;
3+
using Avalonia.Interactivity;
4+
using Avalonia.Xaml.Interactivity;
5+
6+
namespace Avalonia.Xaml.Interactions.Custom;
7+
8+
/// <summary>
9+
///
10+
/// </summary>
11+
public class PointerMovedTrigger : RoutedEventTriggerBase
12+
{
13+
static PointerMovedTrigger()
14+
{
15+
EventRoutingStrategyProperty.OverrideMetadata<PointerMovedTrigger>(
16+
new StyledPropertyMetadata<RoutingStrategies>(
17+
defaultValue: RoutingStrategies.Tunnel | RoutingStrategies.Bubble));
18+
}
19+
20+
/// <summary>
21+
///
22+
/// </summary>
23+
public bool MarkAsHandled { get; set; }
24+
25+
/// <summary>
26+
///
27+
/// </summary>
28+
/// <param name="disposables"></param>
29+
protected override void OnAttached(CompositeDisposable disposables)
30+
{
31+
if (AssociatedObject is InputElement element)
32+
{
33+
var disposable = element.AddDisposableHandler(
34+
InputElement.PointerMovedEvent,
35+
OnPointerMoved,
36+
EventRoutingStrategy);
37+
disposables.Add(disposable);
38+
}
39+
}
40+
41+
private void OnPointerMoved(object? sender, PointerEventArgs e)
42+
{
43+
if (!IsEnabled)
44+
{
45+
return;
46+
}
47+
48+
e.Handled = MarkAsHandled;
49+
Interaction.ExecuteActions(AssociatedObject, Actions, e);
50+
}
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System.Reactive.Disposables;
2+
using Avalonia.Input;
3+
using Avalonia.Interactivity;
4+
using Avalonia.Xaml.Interactivity;
5+
6+
namespace Avalonia.Xaml.Interactions.Custom;
7+
8+
/// <summary>
9+
///
10+
/// </summary>
11+
public class PointerPressedTrigger : RoutedEventTriggerBase
12+
{
13+
static PointerPressedTrigger()
14+
{
15+
EventRoutingStrategyProperty.OverrideMetadata<PointerPressedTrigger>(
16+
new StyledPropertyMetadata<RoutingStrategies>(
17+
defaultValue: RoutingStrategies.Tunnel | RoutingStrategies.Bubble));
18+
}
19+
20+
/// <summary>
21+
///
22+
/// </summary>
23+
public bool MarkAsHandled { get; set; }
24+
25+
/// <summary>
26+
///
27+
/// </summary>
28+
/// <param name="disposables"></param>
29+
protected override void OnAttached(CompositeDisposable disposables)
30+
{
31+
if (AssociatedObject is InputElement element)
32+
{
33+
var disposable = element.AddDisposableHandler(
34+
InputElement.PointerPressedEvent,
35+
OnPointerPressed,
36+
EventRoutingStrategy);
37+
disposables.Add(disposable);
38+
}
39+
}
40+
41+
private void OnPointerPressed(object? sender, PointerPressedEventArgs e)
42+
{
43+
if (!IsEnabled)
44+
{
45+
return;
46+
}
47+
48+
e.Handled = MarkAsHandled;
49+
Interaction.ExecuteActions(AssociatedObject, Actions, e);
50+
}
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System.Reactive.Disposables;
2+
using Avalonia.Input;
3+
using Avalonia.Interactivity;
4+
using Avalonia.Xaml.Interactivity;
5+
6+
namespace Avalonia.Xaml.Interactions.Custom;
7+
8+
/// <summary>
9+
///
10+
/// </summary>
11+
public class PointerReleasedTrigger : RoutedEventTriggerBase
12+
{
13+
static PointerReleasedTrigger()
14+
{
15+
EventRoutingStrategyProperty.OverrideMetadata<PointerReleasedTrigger>(
16+
new StyledPropertyMetadata<RoutingStrategies>(
17+
defaultValue: RoutingStrategies.Tunnel | RoutingStrategies.Bubble));
18+
}
19+
20+
/// <summary>
21+
///
22+
/// </summary>
23+
public bool MarkAsHandled { get; set; }
24+
25+
/// <summary>
26+
///
27+
/// </summary>
28+
/// <param name="disposables"></param>
29+
protected override void OnAttached(CompositeDisposable disposables)
30+
{
31+
if (AssociatedObject is InputElement element)
32+
{
33+
var disposable = element.AddDisposableHandler(
34+
InputElement.PointerReleasedEvent,
35+
OnPointerReleased,
36+
EventRoutingStrategy);
37+
disposables.Add(disposable);
38+
}
39+
}
40+
41+
private void OnPointerReleased(object? sender, PointerReleasedEventArgs e)
42+
{
43+
if (!IsEnabled)
44+
{
45+
return;
46+
}
47+
48+
e.Handled = MarkAsHandled;
49+
Interaction.ExecuteActions(AssociatedObject, Actions, e);
50+
}
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System.Reactive.Disposables;
2+
using Avalonia.Input;
3+
using Avalonia.Interactivity;
4+
using Avalonia.Xaml.Interactivity;
5+
6+
namespace Avalonia.Xaml.Interactions.Custom;
7+
8+
/// <summary>
9+
///
10+
/// </summary>
11+
public class PointerWheelChangedTrigger : RoutedEventTriggerBase
12+
{
13+
static PointerWheelChangedTrigger()
14+
{
15+
EventRoutingStrategyProperty.OverrideMetadata<PointerWheelChangedTrigger>(
16+
new StyledPropertyMetadata<RoutingStrategies>(
17+
defaultValue: RoutingStrategies.Tunnel | RoutingStrategies.Bubble));
18+
}
19+
20+
/// <summary>
21+
///
22+
/// </summary>
23+
public bool MarkAsHandled { get; set; }
24+
25+
/// <summary>
26+
///
27+
/// </summary>
28+
/// <param name="disposables"></param>
29+
protected override void OnAttached(CompositeDisposable disposables)
30+
{
31+
if (AssociatedObject is InputElement element)
32+
{
33+
var disposable = element.AddDisposableHandler(
34+
InputElement.PointerWheelChangedEvent,
35+
OnPointerWheelChanged,
36+
EventRoutingStrategy);
37+
disposables.Add(disposable);
38+
}
39+
}
40+
41+
private void OnPointerWheelChanged(object? sender, PointerWheelEventArgs e)
42+
{
43+
if (!IsEnabled)
44+
{
45+
return;
46+
}
47+
48+
e.Handled = MarkAsHandled;
49+
Interaction.ExecuteActions(AssociatedObject, Actions, e);
50+
}
51+
}

0 commit comments

Comments
 (0)