【问题标题】:WPF Button in ContextMenu needs StaysOpenOnClickContextMenu 中的 WPF 按钮需要 StaysOpenOnClick
【发布时间】:2016-12-12 08:59:42
【问题描述】:

我使用带有按钮的 ContextMenu。 每当按下特殊按钮时,我都希望关闭 ContextMenu。 我看到了一个名为“StaysOpenOnClick”的 MenuItem 的可能性.. 这工作得很好。

这就是我需要的 Button.. 如果有人能提供帮助,尤其是只有 XAML 的解决方案会很好!

提前致谢。

【问题讨论】:

  • 你的 XAML 现在是什么样子的?

标签: c# wpf xaml button contextmenu


【解决方案1】:

您可以通过使用 BooleanAnimationUsingKeyFrames 为其 IsOpen 属性设置动画来关闭 ContextMenu。这是一个仅限 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 中的所有按钮都关闭了。我只想用一个叫做“设置”的按钮来关闭它。

在这种情况下,您可以将 EventTrigger 的 SourceName 属性设置为“设置”按钮的 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>

【讨论】:

  • 我猜你不需要按钮的 Click 事件。无论如何,此解决方案有效,但 ContextMenu 现在对我的 ContextMenu 中的所有按钮都关闭了。我只想用一个叫做“设置”的按钮来关闭它。
  • 请看我编辑的答案。如果对您有帮助,还请记得接受并投票:)
【解决方案2】:

我不完全确定您想要的是什么,但这里有一个带有按钮的上下文菜单:

<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 的解决方案。)

【讨论】:

  • 如果您将按钮更改为切换按钮,您应该能够绑定到 IsOpen 属性,删除后面的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 2022-01-03
  • 1970-01-01
相关资源
最近更新 更多