Как отключить мнемонику в меню WPF?

У меня динамические строки отображаются как заголовок MenuItem, который иногда содержит'_'. WPF рассматривает подчеркивания как знаки для мнемоники, но я этого не хочу. Как это отключить?

2 ответов


после попытки всех решений в потоке в WPF ListBox элемент. Пропустить символы подчеркивания в строках, который, казалось, не работал на MenuItems, я сделал это:

public class EscapeMnemonicsStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string str = value as string;
        return str != null ? str.Replace("_", "__") : value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

альтернативным решением является размещение текста меню внутри TextBox с заданными свойствами.

если дом свой MenuItem в коде это будет выглядеть так:

var menuItem = new MenuItem();
var menuHeader = new Textbox();
menuHeader.Text = "your_text_here";
menuHeader.IsReadOnly = true;
menuHeader.Background = Brushes.Transparent;
menuHeader.BorderThickness = new Thickness(0);
menuItem.Header = menuHeader;
menuItem.ToolTip = "your detailed tooltip here";
menuItem.Click += YourEventHandlerHere;
yourMenu.Items.Add(menuItem);

если ваше меню находится в XAML, и это только текст, который является динамическим, это будет выглядеть так:

<MenuItem Name="menuDynamic" Click="menuDynamic_Click">
    <MenuItem.Header>
        <TextBox Name="dynamicMenu"
                 Text="With_Underscore"
                 IsReadOnly="True"
                 Background="Transparent"
                 BorderThickness="0" />
    </MenuItem.Header>
</MenuItem>

тогда ваш код позади может динамически установить dynamicMenu.Text = "what_ever"; когда это необходимо.