Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/Plugin.Maui.KeyListener/KeyPressedEventArgs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
public sealed class KeyPressedEventArgs : EventArgs
{
public KeyboardModifiers Modifiers { get; internal set; }
public KeyboardKeys Keys { get; internal set; }
public KeyboardKeys Key { get; internal set; }

public char KeyChar { get; internal set; }
public bool Handled { get; set; }
}
97 changes: 60 additions & 37 deletions src/Plugin.Maui.KeyListener/KeyboardBehavior.Windows.cs
Original file line number Diff line number Diff line change
@@ -1,85 +1,108 @@
#if WINDOWS
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Plugin.Maui.KeyListener;

public partial class KeyboardBehavior : PlatformBehavior<VisualElement>
{
protected override void OnAttachedTo(VisualElement bindable, FrameworkElement platformView)
public KeyboardBehavior()
{
base.OnAttachedTo(bindable, platformView);
// We prefer preview events on Windows
UsePreviewEvents = true;
}

var window = bindable.Window.Handler.PlatformView as Microsoft.UI.Xaml.Window;
// See: https://github.com/CommunityToolkit/Maui/issues/1912
private List<Guid> _boundIds = [Guid.Empty];

Comment on lines +15 to 16
Copy link

Copilot AI Apr 9, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The initialization of _boundIds using [Guid.Empty] is not valid C# syntax; consider changing it to 'new List { Guid.Empty }' if the intention is to start with a default value, or initialize an empty list if no default is required.

Suggested change
private List<Guid> _boundIds = [Guid.Empty];
private List<Guid> _boundIds = new List<Guid> { Guid.Empty };

Copilot uses AI. Check for mistakes.

window.Content.KeyDown += OnKeyDown;
window.Content.KeyUp += OnKeyUp;
window.Content.PreviewKeyDown += OnPreviewKeyDown;
window.Content.PreviewKeyUp += OnPreviewKeyUp;
protected override void OnAttachedTo(VisualElement bindable, FrameworkElement platformView)
{
// Handle case where element is bound multiple times, we only allow a single binding for this behavior
if (_boundIds.Contains(bindable?.Id ?? Guid.Empty)) { return; }
_boundIds.Add(bindable.Id);

//platformView.KeyDown += OnKeyDown;
//platformView.KeyUp += OnKeyUp;
//platformView.PreviewKeyDown += OnPreviewKeyDown;
//platformView.PreviewKeyUp += OnPreviewKeyUp;
if (UsePreviewEvents)
{
platformView.PreviewKeyDown += OnPreviewKeyDown;
platformView.PreviewKeyUp += OnPreviewKeyUp;
}
else
{
platformView.KeyDown += OnKeyDown;
platformView.KeyUp += OnKeyUp;
}

base.OnAttachedTo(bindable, platformView);
}

protected override void OnDetachedFrom(VisualElement bindable, FrameworkElement platformView)
{
base.OnDetachedFrom(bindable, platformView);

var window = bindable.Window.Handler.PlatformView as Microsoft.UI.Xaml.Window;
if ((bindable?.Id ?? Guid.Empty) != Guid.Empty && _boundIds.Contains(bindable.Id)) { _boundIds.Remove(bindable.Id); }

window.Content.KeyDown -= OnKeyDown;
window.Content.KeyUp -= OnKeyUp;
window.Content.PreviewKeyDown -= OnPreviewKeyDown;
window.Content.PreviewKeyUp -= OnPreviewKeyUp;
if (UsePreviewEvents)
{
platformView.PreviewKeyDown -= OnPreviewKeyDown;
platformView.PreviewKeyUp -= OnPreviewKeyUp;
}
else
{
platformView.KeyDown -= OnKeyDown;
platformView.KeyUp -= OnKeyUp;
}

//platformView.KeyDown -= OnKeyDown;
//platformView.KeyUp -= OnKeyUp;
//platformView.PreviewKeyDown -= OnPreviewKeyDown;
//platformView.PreviewKeyUp -= OnPreviewKeyUp;
base.OnDetachedFrom(bindable, platformView);
}

void OnWindowKeyDown(object sender, Microsoft.UI.Xaml.Input.KeyRoutedEventArgs e)
void OnPreviewKeyDown(object sender, Microsoft.UI.Xaml.Input.KeyRoutedEventArgs e)
{
Console.WriteLine($"OnWindowKeyDown {e.Key}");
char keyChar = ((char)e.Key);
var eventArgs = new KeyPressedEventArgs
{
Key = e.Key.ToKeyboardKey(),
KeyChar = keyChar
};

this.RaiseKeyDown(eventArgs);

e.Handled = eventArgs.Handled;
}

void OnKeyDown(object sender, Microsoft.UI.Xaml.Input.KeyRoutedEventArgs e)
{
char keyChar = ((char)e.Key);
var eventArgs = new KeyPressedEventArgs
{
Keys = e.Key.ToKeyboardKeys(),
Key = e.Key.ToKeyboardKey(),
KeyChar = keyChar
};

this.RaiseKeyDown(eventArgs);

e.Handled = eventArgs.Handled;
}

void OnPreviewKeyUp(object sender, Microsoft.UI.Xaml.Input.KeyRoutedEventArgs e)
{
Console.WriteLine($"OnPreviewKeyUp {e.Key}");
}
char keyChar = ((char)e.Key);
var eventArgs = new KeyPressedEventArgs
{
Key = e.Key.ToKeyboardKey(),
KeyChar = keyChar
};

void OnPreviewKeyDown(object sender, Microsoft.UI.Xaml.Input.KeyRoutedEventArgs e)
{
Console.WriteLine($"OnPreviewKeyDown {e.Key}");
this.RaiseKeyUp(eventArgs);
e.Handled = eventArgs.Handled;
}

void OnKeyUp(object sender, Microsoft.UI.Xaml.Input.KeyRoutedEventArgs e)
{
char keyChar = ((char)e.Key);
var eventArgs = new KeyPressedEventArgs
{
Keys = e.Key.ToKeyboardKeys(),
Key = e.Key.ToKeyboardKey(),
KeyChar = keyChar
};
this.RaiseKeyUp(eventArgs);
e.Handled = eventArgs.Handled;
}
}
#endif
12 changes: 2 additions & 10 deletions src/Plugin.Maui.KeyListener/KeyboardBehavior.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Plugin.Maui.KeyListener
namespace Plugin.Maui.KeyListener
{
public partial class KeyboardBehavior : PlatformBehavior<VisualElement>
{
KeyboardBehaviorTriggers _triggers;

public KeyboardBehaviorTriggers Triggers => _triggers ??= new KeyboardBehaviorTriggers();
public bool UsePreviewEvents { get; set; }

public event EventHandler<KeyPressedEventArgs> KeyDown;
public event EventHandler<KeyPressedEventArgs> KeyUp;
Expand Down
6 changes: 0 additions & 6 deletions src/Plugin.Maui.KeyListener/KeyboardBehavior.iOS.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,4 @@
#if MACCATALYST || IOS
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Foundation;
using UIKit;

namespace Plugin.Maui.KeyListener
Expand Down
39 changes: 0 additions & 39 deletions src/Plugin.Maui.KeyListener/KeyboardBehaviorTrigger.Windows.cs

This file was deleted.

54 changes: 0 additions & 54 deletions src/Plugin.Maui.KeyListener/KeyboardBehaviorTrigger.cs

This file was deleted.

41 changes: 0 additions & 41 deletions src/Plugin.Maui.KeyListener/KeyboardBehaviorTrigger.iOS.cs

This file was deleted.

1 change: 0 additions & 1 deletion src/Plugin.Maui.KeyListener/KeyboardFlags.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ public enum KeyboardModifiers
Alt = 16
}

[Flags]
public enum KeyboardKeys
{
None,
Expand Down
Loading