Нажатие клавиши в ContentDialog - PullRequest
0 голосов
/ 13 ноября 2018

Итак, у меня есть кнопка в Xaml:

    <Button x:Name="btnCancel"
            Click="btnCancel_Click"
            Content="Cancel"></Button>

и в ContentDialog я хочу нажать клавишу, чтобы вызвать эту кнопку. Моя проблема в том, что нажатие клавиш не распознается, и я не понимаю, почему.

.cs:

public sealed partial class MyDialog : ContentDialog
{
    public MyDialog()
    {
        this.InitializeComponent();
        this.Loaded += MyDialog_Loaded;

        this.Closing += ContentDialog_Closing;
        this.KeyDown += onE_KeyDown;   
    }

//...

    private void onE_KeyDown(object sender, KeyRoutedEventArgs e)
    {
        if (e.Key == Windows.System.VirtualKey.Escape)
        {
            //btnCancel_Click(sender, e); 
            btnCancel_Click(this, new RoutedEventArgs());
        }
    }

    void ContentDialog_Closing(ContentDialog sender, ContentDialogClosingEventArgs args)
    {
        args.Cancel = syncInProcess;
       // btnCancel_Click(this, new RoutedEventArgs());
    }
}

Я поставил точку останова на методе onE_KeyDown, но он никогда не достигнет этого.

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Попробуйте использовать Событие CoreWindow.KeyDown вместо:

Window.Current.CoreWindow.KeyDown += CoreWindow_KeyDown;
//this.KeyDown += MyDialog_KeyDown;

Кроме того, если вы не учитываете случай, когда клавиатура не отпускается в течение длительного времени, попробуйте использовать Событие KeyUp , которое можно запустить обычным образом.

Кстати, клавиша Esc на клавиатуре закроет ContentDialog по умолчанию , поэтому вам нужно сначала отключить эту функцию в событии закрытия.

Код соревнования:

public MyDialog()
{
    this.InitializeComponent();
    this.Loaded += MyDialog_Loaded;

    this.Closing += ContentDialog_Closing;
    //this.KeyDown += onE_KeyDown;
    this.KeyUp += MyDialog_KeyUp;
}

private void MyDialog_KeyUp(object sender, KeyRoutedEventArgs e)
{
    if (e.Key == Windows.System.VirtualKey.Escape)
    {
        //btnCancel_Click(sender, e); 
        btnCancel_Click(this, new RoutedEventArgs());
    }
}

void ContentDialog_Closing(ContentDialog sender, ContentDialogClosingEventArgs args)
{
    //args.Cancel = syncInProcess;
    // btnCancel_Click(this, new RoutedEventArgs());
    if (args.Result == ContentDialogResult.None)
    {
        args.Cancel = true;
    }
}
0 голосов
/ 10 декабря 2018

Событие, которое вы ищете, это PreviewKeyDown событие. Событие Keydown не будет запущено, если этот конкретный ключ обрабатывается по умолчанию системой. PreviewKeyDown срабатывает во всех случаях.

Примечание: убедитесь, что вы установили e.handled = false для остальных ключей

https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.uielement.previewkeydown

 <ContentDialog
    x:Class="App1.NewContentDialog"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="TITLE"
    PreviewKeyDown="ContentDialog_PreviewKeyDown"
    PrimaryButtonText="Button1"
    SecondaryButtonText="Button2"
    PrimaryButtonClick="ContentDialog_PrimaryButtonClick"
    SecondaryButtonClick="ContentDialog_SecondaryButtonClick">

    <Grid>
    </Grid>
</ContentDialog>


private void ContentDialog_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
    {
        if (e.Key == Windows.System.VirtualKey.Escape)
        {
            btnCancel_Click(this, new RoutedEventArgs());
        }
        else
        {
            e.Handled = false;
        }    
    }
0 голосов
/ 14 ноября 2018

Если событие KeyDown никогда не запускается, есть вероятность, что элемент управления обрабатывает его внутренне. MSDN говорит:

Определенные элементы управления Windows Runtime могут иметь обработку на основе классов для события ввода KeyDown. Если это так, элемент управления, вероятно, имеет переопределение для метода OnKeyDown. Обычно эти обработчики классов предназначены для обработки подмножества нажатий клавиш, которые обеспечивают взаимодействие пользователя с этим элементом управления на основе клавиатуры, и часто это взаимодействие поддерживает функцию доступности клавиатуры. Если нажатие клавиши обрабатывается обработкой на основе классов, то нажатие клавиши считается уже обработанным, и событие KeyDown не вызывается для обработки какими-либо обработчиками пользовательского кода на этом элементе управления специально для этой клавиши.

В этом случае вы можете попробовать переписать OnKeyDown метод , чтобы изменить это поведение. К сожалению, я не могу сейчас проверить, действительно ли это проблема, но, возможно, это поможет вам.

...