
Хотя это работает, у меня есть проблема с удобством использования. Поведение по умолчанию при открытии ContentDialog — установка фокуса на первый интерактивный элемент, которым является флажок. Я не хочу этого. Я хочу, чтобы фокус был на кнопке по умолчанию, то есть CloseButton. Это самый безопасный неразрушающий элемент пользовательского интерфейса.
Обновление: на самом деле это связано с непоследовательным отображением выделения фокуса — скругленного прямоугольника вокруг текущего элемента управления. Открытие ContentDialog с помощью нажатия кнопки не отображает прямоугольник фокуса, тогда как событие клавиатуры, такое как 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
Мобильная версия