WPF Popup MenuItem остается выделенным при использовании клавиш со стрелками - PullRequest
1 голос
/ 06 марта 2011

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

Это происходит с очень простым всплывающим меню:

<Grid>
    <Button x:Name="Button1" Content="Open Menu" 
            Click="OnPopupMenuButton_Click"
            Height="23" HorizontalAlignment="Left" Margin="69,12,0,0" VerticalAlignment="Top" Width="75" />

    <Popup x:Name="MyPopupMenu" StaysOpen="False" >
        <StackPanel Orientation="Vertical" Background="White" Margin="0">
            <MenuItem x:Name="xAimee" Header="Aimee" Margin="0,2,0,0" />
            <MenuItem x:Name="xBarbara" Header="Barbara" />
            <MenuItem x:Name="xCarol" Header="Carol" />
            <Separator x:Name="xSeparator1" Margin="0,2,2,2"/>
            <MenuItem x:Name="xDana" Header="Dana" />
            <MenuItem x:Name="xElizabeth" Header="Elizabeth" />
        </StackPanel>
    </Popup>
</Grid>

Вот как открывается всплывающее окно:

private void OnPopupMenuButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
    Button button = sender as Button;

    MyPopupMenu.PlacementTarget = button;
    MyPopupMenu.Placement = PlacementMode.Mouse;
    MyPopupMenu.IsOpen = true;
    MyPopupMenu.StaysOpen = false;
}

1 Ответ

0 голосов
/ 07 марта 2011

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

Итак, в конце концов, я в конечном итоге воспользовался контекстным меню, но я сделал несколько особых вещей.Во-первых, в конструкторе Window я установил для ContextMenu кнопки значение null, чтобы он не открывался при щелчке правой кнопкой мыши.Затем, когда пользователь щелкает левой кнопкой мыши, я программно устанавливаю ContextMenu на тот, который я создал в файле xaml.Когда меню закрывается, я возвращаю ноль ContextMenu кнопки.Вместо этого я попытался манипулировать видимостью ContextMenu, но, похоже, это не сработало, а установил для него значение null и обратно к объекту.

Вот последний xaml, не слишком отличающийся от исключения вопроса, которым я являюсьобработка события Closed для ContextMenu.

<Button x:Name="xOpenContextMenuButton" Content = "Open Menu" 
    Click="OnContextMenuButton_Click"
    HorizontalAlignment="Right" VerticalAlignment="Bottom" 
    Width="80" Margin="0,0,36,8" Height="23">

    <Button.ContextMenu>
        <ContextMenu x:Name="xContextMenu" Closed="OnContextMenu_Closed">
            <MenuItem x:Name="xAimee" Header="Aimee" />
            <MenuItem x:Name="xBarbara" Header="Barbara" />
            <MenuItem x:Name="xCarol" Header="Carol" />
            <Separator x:Name="xSeparator1" Margin="0,2,2,2" />
            <MenuItem x:Name="xDana" Header="Dana" />
            <MenuItem x:Name="xElizabeth" Header="Elizabeth" />
        </ContextMenu>
    </Button.ContextMenu>
</Button>

Вот код, который сильно изменился:

public MainWindow()
{
    InitializeComponent();

    xOpenContextMenuButton.ContextMenu = null;
}

private void OnContextMenuButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
    xOpenContextMenuButton.ContextMenu = xContextMenu;

    xContextMenu.PlacementTarget = xOpenContextMenuButton;
    xContextMenu.Placement = PlacementMode.Top;

    xContextMenu.IsOpen = true;
    xContextMenu.StaysOpen = false;
}

private void OnContextMenu_Closed(object sender, RoutedEventArgs e)
{
    xOpenContextMenuButton.ContextMenu = null;
}

Еще раз, спасибо archer, потому что я этого не сделалпонимать, что использование Popup не было нормальным способом создания всплывающего меню в WPF.Я думаю, что основной причиной проблемы является то, что всплывающее окно может содержать что угодно - метку, другую кнопку и т. Д. Всплывающее окно не обязательно ожидает встроенные элементы MenuItem, поэтому оно не достаточно умно, чтобы понять, что оно должно переключаться между моим меню.элементы при использовании клавиш со стрелками.Но ContextMenu ожидает наличия в нем MenuItems, поэтому он знает, как переключаться между ними.

...