Browse Source

Fix winforms mnemonic handler being called when textbox is focused. (#20091)

* fix winforms pneumonic handler being called when textbox is focused.

* use GetService instead
pull/18827/head
Emmanuel Hansen 3 months ago
committed by GitHub
parent
commit
28f687ec63
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 36
      src/Windows/Avalonia.Win32.Interoperability/WinForms/WinFormsAvaloniaControlHost.cs

36
src/Windows/Avalonia.Win32.Interoperability/WinForms/WinFormsAvaloniaControlHost.cs

@ -4,9 +4,12 @@ using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using Avalonia.Controls.Embedding;
using Avalonia.Input;
using Avalonia.Input.Raw;
using Avalonia.Reactive;
using Avalonia.Win32.Interop;
using WinFormsControl = System.Windows.Forms.Control;
using AvControl = Avalonia.Controls.Control;
using WinFormsControl = System.Windows.Forms.Control;
namespace Avalonia.Win32.Interoperability;
@ -18,6 +21,7 @@ public class WinFormsAvaloniaControlHost : WinFormsControl, IMessageFilter
{
private AvControl? _content;
private EmbeddableControlRoot? _root;
private IDisposable? _postProcessInputDisposable;
private IntPtr WindowHandle => _root?.TryGetPlatformHandle()?.Handle ?? IntPtr.Zero;
@ -27,6 +31,29 @@ public class WinFormsAvaloniaControlHost : WinFormsControl, IMessageFilter
public WinFormsAvaloniaControlHost()
{
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
var inputManager = AvaloniaLocator.Current.GetService<IInputManager>();
if(inputManager != null )
{
_postProcessInputDisposable = inputManager.PostProcess.Subscribe(new AnonymousObserver<RawInputEventArgs>(PostProcessInput));
}
}
private void PostProcessInput(RawInputEventArgs args)
{
if (_root?.IsKeyboardFocusWithin == false)
return;
if(!args.Handled && args is RawTextInputEventArgs textArgs)
{
var text = textArgs.Text;
if (!string.IsNullOrEmpty(text))
{
args.Handled = this.ProcessDialogChar(text[0]);
}
}
}
/// <summary>
@ -89,6 +116,8 @@ public class WinFormsAvaloniaControlHost : WinFormsControl, IMessageFilter
_root?.Dispose();
_root = null;
}
_postProcessInputDisposable?.Dispose();
_postProcessInputDisposable = null;
base.Dispose(disposing);
}
@ -140,6 +169,11 @@ public class WinFormsAvaloniaControlHost : WinFormsControl, IMessageFilter
}
}
protected override bool IsInputChar(char charCode)
{
return true;
}
public bool PreFilterMessage(ref Message m)
{
var message = (UnmanagedMethods.WindowsMessage)m.Msg;

Loading…
Cancel
Save