提问人:simone 提问时间:5/31/2023 最后编辑:simone 更新时间:7/17/2023 访问量:334
如何获取毛伊岛的keydown事件,选择所有条目文本,删除条目unline
How the Maui to get keydown events,select all text of entry ,remove entry undline
问:
如何使用 MAUI 创建 keydown 事件?此外,我们知道没有直接视图供我们使用 keydown 或 keyup,但我研究了 nativeview (Android) 或使用 render 中的处理程序映射器,但如何实现它们的细节尚不清楚。或者是否有其他方法可以在 MAUI 中获取按键事件?谢谢
我开发了一个斑马应用程序;有一个用于扫描的条目,所以它需要一个 keydown 事件(也许你会说我们可以使用 textchanged;实际上,我已经尝试过了,它有效,但还有一些其他问题,不好,比如选择文本,因为我的条目还有另一个功能,那就是输入一个像 id 这样的数字,然后按 'enter' 键来获取 codbarre;第二个功能是扫描;所以这里的问题是我需要一个条件控制输入;其平均 ID 长度不能超过 13 (codebarre);textchange 的另一个问题是,当我再次扫描相同的 codbare 时,它不会选择所有文本)所以 keydown 将是一个完美的解决方案,但是如何在毛伊岛获得 keydwon 事件?
答:
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
我希望这能有所帮助:
- 创建一个实现接口的类并定义一个相关的委托:
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
- 在包含条形码条目(例如,名为“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
}
- 定义条目的键盘处理程序函数(该示例仅处理 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
- 最后(但非常重要),将对 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原创。
评论