WinUI 3 – Как установить фокус на кнопку ContentDialogC#

Место общения программистов C#
Ответить
Anonymous
 WinUI 3 – Как установить фокус на кнопку ContentDialog

Сообщение Anonymous »

У меня есть приложение WinUI 3, написанное на C#, которое отображает ContentDialog, чтобы попросить пользователя подтвердить удаление файлов. В диалоговом окне есть флажок, который пользователь может установить, чтобы скрыть диалоговое окно от отображения в будущем:
Изображение

Хотя это работает, у меня есть проблема с удобством использования. Поведение по умолчанию при открытии 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 с:
< Br />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...
}
}
}
}
< /code>
  • Запустите проект. < /p>
    < /li>
    < P> нажмите DELETE и наблюдать диалог подтверждения, отображаемый сфокусирован флажок.


Подробнее здесь: https://stackoverflow.com/questions/793 ... log-button
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»