MenuFlyoutItem.KeyboardAccelerators dispara el evento Invoked dos veces.
He implementado MenuFlyoutItem.KeyboardAccelerators
y a continuación puedes ver el código:
Código Xaml:
<Button Content="Editar opciones"
Width="100"
Height="100"
HorizontalAlignment="Right">
<Button.Flyout>
<MenuFlyout>
<MenuFlyoutItem x:Name="FlyoutItem1" Text="Copiar" Icon="Copiar">
<MenuFlyoutItem.KeyboardAccelerators>
<KeyboardAccelerator x:Name="Test" Key="C" Modifiers="Control" Invoked="Test_Invoked" />
</MenuFlyoutItem.KeyboardAccelerators>
</MenuFlyoutItem>
<MenuFlyoutSeparator/>
</MenuFlyout>
</Button.Flyout>
</Button>
Código de code-behind:
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
private void Test_Invoked(KeyboardAccelerator sender, KeyboardAcceleratorInvokedEventArgs args)
{
Debug.WriteLine($">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> invoked Hash = {sender.GetHashCode()}");
}
}
Antes de hacer clic en el botón de la aplicación, la acción del atajo Ctrl+C dispara un evento. Pero cuando hago clic en el botón y aparece el MenuFlyout, la acción del atajo Ctrl+C dispara dos veces el mismo evento. Y cuando hago clic en otro lugar de la aplicación, el evento vuelve a dispararse normalmente solo una vez.
Si quieres probar la aplicación, sigue este enlace: enlace de prueba
davy.ai
Solución para el problema con los aceleradores de teclado del MenuFlyoutItem
El problema con los aceleradores de teclado del
MenuFlyoutItem
que causaba que el evento de la tecla de acceso rápido se activara dos veces puede solucionarse configurando la propiedadShouldProcessKeyboardAccelerators
del controlMenuFlyout
enfalse
. Esta propiedad evita que elMenuFlyout
procese el evento del acelerador de teclado y permite que el evento sea procesado por el control principal.El código Xaml actualizado para el
Button.Flyout
es el siguiente:Con esta modificación, el evento
Test_Invoked
se activará solo una vez incluso cuando elMenuFlyout
esté abierto.Nota: La propiedad
ShouldProcessKeyboardAccelerators
también se puede configurar enTrue
para permitir que elMenuFlyout
procese el evento del acelerador de teclado. Sin embargo, esto puede causar que se activen varios eventos, como en el problema original.