WPF: дублирование ключей доступа в диалоговом окне

У меня есть пользовательский элемент управления, содержащий несколько флажков. Каждый CheckBox имеет уникальный ключ доступа. Теперь, если я использую более одного экземпляра этого пользовательского элемента управления в диалоговом окне, клавиши доступа не работают должным образом. Фокус правильно переходит к флажкам, когда нажата клавиша доступа, но флажок не установлен или не установлен.

Чтобы проиллюстрировать это, скажем, у вас есть этот XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>

            <CheckBox Grid.Row="0" Content="_First" Margin="5"/>
            <CheckBox Grid.Row="1" Content="F_urst" Margin="5"/>
        </Grid>
</Window>

Если вы запустите приведенный выше код, флажки будут отмечены/сняты при нажатии клавиш Alt+F или Alt+U.

Теперь предположим, что у вас есть этот XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>

            <CheckBox Grid.Row="0" Content="_First" Margin="5"/>
            <CheckBox Grid.Row="1" Content="_Furst" Margin="5"/>
        </Grid>
</Window>

Здесь оба флажка имеют одинаковую клавишу доступа «F». Теперь, если мы нажмем Alt+F, фокус будет перемещаться по флажкам, не выбирая их. Я хочу, чтобы флажки были отмечены или сняты, как обычно.

кто-нибудь знает, как решить эту проблему? Или даже лучшая идея для обработки таких сценариев?

PS: я знаю, что дублировать клавиши доступа в одном и том же диалоговом окне не имеет смысла, но приведенный выше код приведен только для иллюстрации. Моя проблема (как я объяснил выше) заключается в том, что я использую пользовательский элемент управления несколько раз в диалоговом окне, и, следовательно, клавиши доступа в элементе управления повторяются.


person digitguy    schedule 19.09.2013    source источник


Ответы (1)


Такое поведение является нормальным. Как бы вы предложили любой другой сценарий, который будет работать? Если два элемента управления имеют одинаковую клавишу доступа, то клавиша, которая обычно выбирает элемент управления, теперь чередуется между ними. Как и в случае со всеми элементами управления Checkbox, вы можете просто нажать Пробел, чтобы выбрать или отменить выбор. Таким образом, решение состоит в том, чтобы выбрать элемент управления с помощью клавиши доступа и установить или снять флажок с помощью Пробел.

ОБНОВЛЕНИЕ >>>

Лично я бы не стал пытаться обойти это поведение, вместо этого предпочитая объяснять пользователям, как на самом деле работает система. Если это вас действительно беспокоит, можно найти обходной путь, но это потребует много работы и, на мой взгляд, не стоит того.

Например, вы можете добавить в конструктор Dialog код, который будет динамически устанавливать все свойства, определяющие ключи доступа. Проблема с этим, однако, заключается в том, что за пределами Dialog вам нужно вести учет того, сколько других элементов управления Dialog было открыто в настоящее время и какие буквы использовались для каких свойств для каждого из них.

Удачи, если вы решите бродить по этому одинокому пути.

person Sheridan    schedule 19.09.2013
comment
Согласен, и я ожидал этого ответа. И в какой-то степени я считаю, что это правильное поведение. Но как бы вы решили такую ​​проблему в WPF (или вообще в любом фреймворке?) Точнее, как бы вы избежали такой проблемы в любом приложении? - person digitguy; 19.09.2013