Сосредоточьтесь MenuItem в подменю WPF

Я пишу приложение с меню, содержащим подменю. Также у меня есть StatusBar, где я хочу отображать информацию о сфокусированном MenuItem, когда пользователь перемещается по меню с помощью клавиатуры. Я пытался обработать событие GotFocus из каждого MenuItem и изменить содержимое StatusBar на тег отправителя, но он работает только с MenuItem 1, а не с 1.1 и 2.2.

XAML:

<Menu Height="23" x:Name="mainMenu">
    <MenuItem Header="Header1" Tag="Info1" GotFocus="MenuItem_GotFocus_1">
        <MenuItem Header="Header1.1" Tag="Info1.1" GotFocus="MenuItem_GotFocus_1"/>
        <MenuItem Header="Header1.2"  Tag="Info1.1" GotFocus="MenuItem_GotFocus_1"/>
        ...
    </MenuItem>
    ...
</Menu>

C#:

private void MenuItem_GotFocus_1(object sender, RoutedEventArgs e)
{
    statusBarItem.Content = (sender as FrameworkElement).Tag;
}

Как я могу отобразить информацию о предметах, выделенных подменю? Может быть, есть другие способы сделать это?

Спасибо, Александр.

1 ответ

Не уверен, что это относится именно к тому, что вам нужно, но я думаю, что это то, что вам нужно...

Всегда лучше привязать к view-модели - и тогда вы можете выставить этот "статус" в другом месте, просто привязавшись к нему...

В случае IsFocused (Если вы говорите о стандартных пунктах меню WPF), существует небольшая проблема с привязкой к нему, так как это только для чтения, поэтому привязка завершается с чем-то вроде
http://meleak.wordpress.com/2011/08/28/onewaytosource-binding-for-readonly-dependency-property/
(это также хороший пример этого решения, похожего только на ActiveWidth/Height)

<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
    <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
    <Setter Property="pb:PushBindingManager.StylePushBindings">
            <Setter.Value>
    <pb:PushBindingCollection>
    <pb:PushBinding TargetProperty="IsFocused" Path="IsFocused"/>
    </pb:PushBindingCollection>
            </Setter.Value>
    </Setter>

Вы можете скачать проект / lib для поддержки по ссылке в статье выше (PushBindingManager) Поставить что-то вроде xmlns:pb="clr-namespace:PushBindingExtension;assembly=some-assembly" (Я скопировал, интегрировал, поэтому у меня нет точного источника / имени здесь).

И вы должны быть готовы к работе. Просто сделай IsFocused в вашей модели представления свяжите меню с ним - и затем поднимите этот любой пункт is focused на статус. Здесь требуется некоторая "работа ногами", но она довольно минимальна.

Надеюсь это поможет

ПРИМЕЧАНИЕ. Используйте другую ссылку для загрузки (например, http://dl.dropbox.com/u/39657172/Blog/PushBindingInStyleDemo.zip).
(этот содержит StylePushBindings который вам нужен, для стилей.

Другие вопросы по тегам