
Хотя это работает, у меня есть проблема с удобством использования. Поведение по умолчанию при открытии ContentDialog — установка фокуса на первый интерактивный элемент, которым является флажок. Я не хочу этого. Я хочу, чтобы фокус был на кнопке по умолчанию, то есть CloseButton. Это самый безопасный и неразрушающий элемент пользовательского интерфейса.
Обновление: на самом деле это противоречиво, и именно в этом заключается настоящая проблема. Открытие ContentDialog с помощью нажатия кнопки правильно фокусируется на кнопке, назначенной как DefaultButton, тогда как событие клавиатуры, такое как KeyUp, или обработка KeyboardAccelerator приводит к нежелательному поведению фокусировки на первом интерактивном элементе управления. Это похоже на ошибку WinUI 3.
Мне известен метод VisualTreeHelper.GetOpenPopupsForXamlRoot(), и я экспериментировал с ним в диалоговом окне «Открыто». code> обработчик событий, но навигация по последующей иерархии не является простой (
Код: Выделить всё
FindName("CloseButton")
Я также попробовал добавить обработчик событий GettingFocus для флажка и выполнить args.TryCancel(), если диалоговое окно только что открылось, но на самом деле это привело к тому, что фокус был перенесен на родительское окно, что это определенно не то, что я хочу!
Чтобы воссоздать эту проблему:
- Создайте новый проект в Visual Studio. Выберите «Пустое упакованное приложение (WinUI 3 на рабочем столе)» в качестве шаблона проекта.
- Назовите проект «CheckboxTest».
- Замените MainWindow.xaml на XAML ниже:
< /ол>Код: Выделить всё
- Замените код MainWindow.xaml.cs на:
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Input;
namespace CheckboxTest;
public sealed partial class MainWindow : Window
{
public MainWindow()
{
this.InitializeComponent();
this.Content.KeyUp += Content_KeyUp;
}
private async void Content_KeyUp(object sender, KeyRoutedEventArgs e)
{
if (e.Key == Windows.System.VirtualKey.Delete)
{
DeleteConfirmationDialog.XamlRoot = Content.XamlRoot;
if (await DeleteConfirmationDialog.ShowAsync() == ContentDialogResult.Primary)
{
// Do delete operation...
}
}
}
}
< /code>
- Запустите проект. < /p>
< /li>
< P> нажмите DELETE и наблюдать диалог подтверждения, отображаемый сфокусирован флажок.
Подробнее здесь: https://stackoverflow.com/questions/793 ... log-button