
Хотя это работает, у меня есть проблема с удобством использования. Поведение по умолчанию при открытии ContentDialog — установка фокуса на первый интерактивный элемент, которым является флажок. Я не хочу этого. Я хочу, чтобы фокус был на кнопке по умолчанию, то есть CloseButton. Это самый безопасный неразрушающий элемент пользовательского интерфейса.
Мне известен метод VisualTreeHelper.GetOpenPopupsForXamlRoot(), и я экспериментировал с ним в диалоговом окне «Открыто». обработчик событий, но навигация по последующей иерархии не является простой (
Код: Выделить всё
FindName("CloseButton")
Я также попробовал добавить обработчик событий GettingFocus для флажка и выполнить args.TryCancel(), если диалоговое окно только что открылось, но на самом деле это привело к тому, что фокус был перенесен на родительское окно, что это определенно не то, что я хочу!
Чтобы воссоздать эту проблему:
- Создайте новый проект в Visual Studio. Выберите «Пустое упакованное приложение (WinUI 3 на рабочем столе)» в качестве шаблона проекта.
- Назовите проект «CheckboxTest».
- Замените MainWindow.xaml на XAML ниже:
< /ол>Код: Выделить всё
- Замените код MainWindow.xaml.cs на:
Код: Выделить всё
using System;
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...
}
}
}
}
- Запустите проект.
- Нажмите Удалить и увидите, что в появившемся диалоговом окне подтверждения установлен флажок.
Подробнее здесь: https://stackoverflow.com/questions/793 ... log-button