如何获取毛伊岛的keydown事件,选择所有条目文本,删除条目unline

How the Maui to get keydown events,select all text of entry ,remove entry undline

提问人:simone 提问时间:5/31/2023 最后编辑:simone 更新时间:7/17/2023 访问量:334

问:

如何使用 MAUI 创建 keydown 事件?此外,我们知道没有直接视图供我们使用 keydown 或 keyup,但我研究了 nativeview (Android) 或使用 render 中的处理程序映射器,但如何实现它们的细节尚不清楚。或者是否有其他方法可以在 MAUI 中获取按键事件?谢谢

我开发了一个斑马应用程序;有一个用于扫描的条目,所以它需要一个 keydown 事件(也许你会说我们可以使用 textchanged;实际上,我已经尝试过了,它有效,但还有一些其他问题,不好,比如选择文本,因为我的条目还有另一个功能,那就是输入一个像 id 这样的数字,然后按 'enter' 键来获取 codbarre;第二个功能是扫描;所以这里的问题是我需要一个条件控制输入;其平均 ID 长度不能超过 13 (codebarre);textchange 的另一个问题是,当我再次扫描相同的 codbare 时,它不会选择所有文本)所以 keydown 将是一个完美的解决方案,但是如何在毛伊岛获得 keydwon 事件?

Maui Keydown 下划线 SelectAll

评论


答:

1赞 simone 5/31/2023 #1

我们可以在任何地方(在构造函数中)调用 ModifyEntry();

  //#region out constructor

void ModifyEntry()
  {
   Microsoft.Maui.Handlers.EntryHandler.Mapper
   .AppendToMapping("MyCustomization",(handler, view) =>
       { 

  #if ANDROID   
 //remove Entry underline

handler.PlatformView.Background = null;
handler.PlatformView.SetBackgroundColor(Android.Graphics.Color.Transparent);
        //keyboard,keydown,keyup event
        handler.PlatformView.KeyPress += (sender, e) =>
        {
            try
            {
                if (e.KeyCode == Android.Views.Keycode.Tab || e.KeyCode == 
             Android.Views.Keycode.Enter)
                {e.Handled = true;

                    if ((e.KeyCode == Android.Views.Keycode.Enter) && _prodottiStorage.List(Content) != null)
                    {//when press key Enter selectall
                        ((Entry)handler.VirtualView).CursorPosition = 0;
                        ((Entry)handler.VirtualView).SelectionLength = ((Entry)handler.VirtualView).Text != null ? ((Entry)handler.VirtualView).Text.Length : 0;
                    }
                    if ((e.KeyCode == Android.Views.Keycode.Enter) && (e.Event.Action == Android.Views.KeyEventActions.Up))
                    {//your codes here:

                        prodottis.Clear();

                        if (_prodottiStorage.ListId(Content) == null)
                        {

                            prodottis.Clear();
                            Content = null;

                        }

                        if (_prodottiStorage.ListId(Content) != null)
                        {
                            foreach (var p in _prodottiStorage.ListId(Content))
                            {

                                prodottis.Add(p); Content = p.CodBarre;
                                ((Entry)handler.VirtualView).CursorPosition = 0;
                                ((Entry)handler.VirtualView).SelectionLength = ((Entry)handler.VirtualView).Text != null ? ((Entry)handler.VirtualView).Text.Length : 0;

                                if (p.CodBarre == string.Empty | p.CodArticolo == 0) { return; }
                            }

                            prodottis.Clear();

                            if (_prodottiStorage.List(Content) == null)
                            {

                                prodottis.Clear();
                                Content = null;

                            }

                            if (_prodottiStorage.List(Content) != null)
                            {
                                p = _prodottiStorage.List(Content);
                                prodottis.Add(p);
                                if (p.CodBarre == string.Empty | p.CodArticolo == 0) { prodottis.Clear(); }
                            }
                        }

                    }
                }
                else

                    e.Handled = false;
            }
            catch (Exception Ex)
            {
            }
        };
    #endif
    });
}#endregion

这里 : https://learn.microsoft.com/en-us/dotnet/maui/user-interface/handlers/customize

评论

1赞 Community 5/31/2023
您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。
1赞 H.A.H. 5/31/2023
老实说,我完全同意这个BOT。这就是我们需要的,是官方的引文和文档。而不必主要依赖社区解决方案。
0赞 simone 5/31/2023
H.A.H很高兴见到你,在这里再见
1赞 rentoulis 6/1/2023 #2

我希望这能有所帮助:

  1. 创建一个实现接口的类并定义一个相关的委托:Android.Views.View.IOnKeyListener
#if ANDROID
using Android.Runtime;
using Android.Views;
#endif

namespace MyNamespace;

#if ANDROID
/// <summary>
/// A delegate for a listener function to handle key events.
/// </summary>
/// <param name="v">The view that received the key event.</param>
/// <param name="keyCode">The code of the pressed key.</param>
/// <param name="e">Extra information about the key event.</param>
/// <returns>True if the listener function has consumed the event, false otherwise.</returns>
public delegate bool OnKeyDelegate(Android.Views.View v, [GeneratedEnum] Keycode keyCode, KeyEvent e);

public class KeyListener : Java.Lang.Object, Android.Views.View.IOnKeyListener
{
    /// <value>
    /// The function that will handle the key events.
    /// </value>
    private readonly OnKeyDelegate OnKeyDelegate;

    /// <summary>
    /// Sets the function that will handle the key events.
    /// </summary>
    /// <param name="onKeyDelegate"></param>
    public KeyListener(OnKeyDelegate onKeyDelegate)
    {
        OnKeyDelegate = onKeyDelegate;
    }

    /// <summary>
    /// Calls the specified listener function to handle the key events.
    /// </summary>
    /// <param name="v">The view that received the key event.</param>
    /// <param name="keyCode">The code of the pressed key.</param>
    /// <param name="e">Extra information about the key event.</param>
    /// <returns>True if the listener function has consumed the event, false otherwise.</returns>
    public bool OnKey(Android.Views.View v, [GeneratedEnum] Keycode keyCode, KeyEvent e)
    {
        if (OnKeyDelegate == null) return false;

        return OnKeyDelegate(v, keyCode, e); // true will intercept keyboard clicks
    }
}
#endif
  1. 在包含条形码条目(例如,名为“BarcodeEntry”)的页面中,定义以下函数:
    /// <summary>
    /// Set controls' key handlers.
    /// </summary>
    private void SetKeyHandler()
    {
#if ANDROID
        if ((BarcodeEntry != null) && (BarcodeEntry.Handler != null))
            (BarcodeEntry.Handler.PlatformView as AppCompatEditText).SetOnKeyListener(new KeyListener(OnBarcodeEntryKey));
#endif
    }
  1. 定义条目的键盘处理程序函数(该示例仅处理 Escape 和 Down-Arrow 键):
#if ANDROID
    /// <summary>
    /// A listener function to handle the key events.
    /// </summary>
    /// <param name="v">The view that received the key event.</param>
    /// <param name="keyCode">The code of the pressed key.</param>
    /// <param name="e">Extra information about the key event.</param>
    /// <returns>True if the listener function has consumed the event, false otherwise.</returns>
    private bool OnBarcodeEntryKey(Android.Views.View v, [GeneratedEnum] Keycode keyCode, KeyEvent e)
    {
        if (e.Action == KeyEventActions.Down)
            switch (keyCode)
            {
                case Keycode.DpadDown:
                    // Your code here
                    return true;

                case Keycode.Escape: 
                    // Your code here
                    return true;

                default: 
                    return false;
            }

        return false;
    }
#endif
  1. 最后(但非常重要),将对 SetKeyHandler() 函数的调用添加到带有条形码输入的页面的 Load 事件中:
    /// <summary>
    /// Initializes page on loading.
    /// </summary>
    /// <param name="sender">The sender.</param>
    /// <param name="e">The event arguments.</param>
    private void Page_Loaded(object sender, EventArgs e)
    {
        SetKeyHandlers();

        // Your code here
    }

评论

0赞 simone 6/1/2023
很好,所有代码都来自Android原创。