Кнопка WPF в ContextMenu нуждается в StaysOpenOnClick

Я использую ContextMenu с кнопками в нем. Всякий раз, когда нажимается специальная кнопка, я хочу, чтобы ContextMenu был закрыт. Я видел возможность для MenuItem, который называется "StaysOpenOnClick".. это работает отлично.

Это то, что мне нужно для кнопки. Особенно было бы неплохо иметь решение только на XAML, если кто-то может помочь!

Заранее спасибо.

2 ответа

Решение

Вы можете закрыть ContextMenu, анимировав его свойство IsOpen, используя BooleanAnimationUsingKeyFrames. Это решение только для XAML:

<Grid Background="Yellow" Width="50" Height="50">
    <Grid.Resources>
        <Storyboard x:Key="sb">
            <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen">
                <DiscreteBooleanKeyFrame KeyTime="0" Value="False" />
            </BooleanAnimationUsingKeyFrames>
        </Storyboard>
    </Grid.Resources>
    <Grid.ContextMenu>
        <ContextMenu x:Name="contextMenu">
            <MenuItem>
                <MenuItem.Header>
                    <Button Content="TheButton" Click="OnButtonClick" />
                </MenuItem.Header>
            </MenuItem>
            <ContextMenu.Triggers>
                <EventTrigger RoutedEvent="ButtonBase.Click">
                    <BeginStoryboard Storyboard="{StaticResource sb}" />
                </EventTrigger>
            </ContextMenu.Triggers>
        </ContextMenu>
    </Grid.ContextMenu>
</Grid>

Это решение работает, но ContextMenu теперь закрывается для всех кнопок в моем ContextMenu. Я просто хотел, чтобы он был закрыт только одной кнопкой под названием "Настройки".

В этом случае вы можете установить для свойства SourceName EventTrigger значение x:Name кнопки "Настройки":

<Grid Background="Yellow" Width="50" Height="50">
        <Grid.Resources>
            <Storyboard x:Key="sb">
                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen">
                    <DiscreteBooleanKeyFrame KeyTime="0" Value="False" />
                </BooleanAnimationUsingKeyFrames>
            </Storyboard>
        </Grid.Resources>
        <Grid.ContextMenu>
            <ContextMenu x:Name="contextMenu">
                <MenuItem>
                    <MenuItem.Header>
                        <Button Content="Settings" x:Name="settingsButton" />
                    </MenuItem.Header>
                </MenuItem>
                <MenuItem>
                    <MenuItem.Header>
                        <Button Content="About" />
                    </MenuItem.Header>
                </MenuItem>
                <ContextMenu.Triggers>
                    <EventTrigger RoutedEvent="ButtonBase.Click" SourceName="settingsButton">
                        <BeginStoryboard Storyboard="{StaticResource sb}" />
                    </EventTrigger>
                </ContextMenu.Triggers>
            </ContextMenu>
        </Grid.ContextMenu>
 </Grid>

Я не совсем уверен, что вы ищете, но вот контекстное меню с кнопкой:

<TextBlock
    Text="Hello, world!">
    <TextBlock.ContextMenu>
        <ContextMenu x:Name="contextMenu">
            <MenuItem>
                <MenuItem.Header>
                    <Button Content="MyButton" Click="OnMenuButtonClick" />
                </MenuItem.Header>
            </MenuItem>
        </ContextMenu>
    </TextBlock.ContextMenu>
</TextBlock>

Если вы обработаете нажатие кнопки следующим образом, оно закроет контекстное меню:

private void OnMenuButtonClick(object sender, RoutedEventArgs e)
{
    contextMenu.IsOpen = false;
}

(Однако решение не только для XAML.)

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