Работа с WPF Menu HeaderStringFormat и ключами доступа среди прочего

Хорошо. Поэтому я хочу, чтобы мое приложение отображало в главном меню элементы "Сохранить" и "Сохранить как..." так же, как это делает Visual Studio; т.е. "Сохранить {текущий файл}" и "Сохранить {текущий файл} как..."

Я также хотел бы иметь нормальные ключи доступа ("S" и "A", соответственно).

Я придумал два решения, но ни одно не очень желательно.

  • Вместо того, чтобы создавать главное меню исключительно в xaml, я мог бы создать все это в MainWindowViewModel, чтобы иметь полный контроль над тем, что входит в сгенерированные элементы MenuItem. Тем не менее, я чувствую, что это будет нарушением MVVM (который я сейчас очень строго соблюдаю), так как мне придется включать ссылки на Icon каждого MenuItem в ViewModel. Плюс это кажется немного грязным.

  • Я могу обозначить заголовок только для этих двух конкретных элементов MenuItem (и, возможно, будущих), но затем я получаю элемент MenuItem, который не только имеет подчеркивание в заголовке, но также не содержит ключа доступа.

<MenuItem Header="{Binding CurrentFileName}"
          HeaderStringFormat="Save {0} _As...">

Что я должен делать?

1 ответ

Решение

Дракончик, разобрался. По крайней мере, о том, как сделать это с помощью всего главного меню, описанного в XAML. Просто сделал содержимое заголовка элементом управления AccessText вместо строки, и он работает как шарм.

<MenuItem>
    <MenuItem.Style>
        <Style TargetType="{x:Type MenuItem}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding HasSelection}" Value="false">
                    <Setter Property="IsEnabled" Value="false"/>
                    <Setter Property="Header">
                        <Setter.Value>
                            <AccessText Text="Save Selected File _As..."/>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding HasSelection}" Value="true">
                    <Setter Property="IsEnabled" Value="true"/>
                    <Setter Property="Header">
                        <Setter.Value>
                            <AccessText Text="{Binding SelectedFile.Filename, StringFormat=Save {0} _As...}"/>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </MenuItem.Style>
</MenuItem>
Другие вопросы по тегам