【问题标题】:Closing ContextMenu with Templated MenuItems使用模板化的 MenuItem 关闭 ContextMenu
【发布时间】:2023-03-13 22:35:01
【问题描述】:

我创建了一个自定义的上下文菜单,我在其中更改了所有项目的外观。 这些项目包含不同的控件,如组合框和按钮。现在,如果按下按钮或选择了组合框项,我希望菜单关闭。目前菜单只是保持打开状态。 能给我一个提示吗?

这是显示我所做的简化代码:

<ContextMenu StaysOpen="False">
    <MenuItem>
        <MenuItem.Template>
            <ControlTemplate>
                <Grid MinWidth="200">
                    <Button Command="{Binding SomeWorkingCommandBinding}">OK</Button>
                </Grid>
            </ControlTemplate>
        </MenuItem.Template>
    </MenuItem>
</ContextMenu>

如前所述,我想在点击 OK 按钮时关闭菜单。

更新

以下按钮(或任何其他控件)无需 Blend SDK 即可完成任务:

<Button.Triggers>
    <EventTrigger RoutedEvent="Button.Click">
        <BeginStoryboard>
            <Storyboard>
                <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(ContextMenu.IsOpen)" Storyboard.Target="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}}">
                    <DiscreteObjectKeyFrame KeyTime="0:0:0">
                        <DiscreteObjectKeyFrame.Value>
                            <sys:Boolean>False</sys:Boolean>
                        </DiscreteObjectKeyFrame.Value>
                    </DiscreteObjectKeyFrame>
                </ObjectAnimationUsingKeyFrames>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
</Button.Triggers>

【问题讨论】:

    标签: wpf xaml contextmenu controltemplate


    【解决方案1】:

    单击按钮后,使用 Blend SDK 的一部分 ChangePropertyAction 更改 ContextMenu 的 IsOpen 属性:

    <ContextMenu x:Name="MyContextMenu">
      <MenuItem>
        <MenuItem.Template>
            <ControlTemplate>
                <Grid MinWidth="200">
                    <Button Command="{Binding SomeWorkingCommandBinding}" Content="OK">
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="Click">
                                <ei:ChangePropertyAction TargetObject="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}}" PropertyName="IsOpen" Value="False"/>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                    </Button>
                </Grid>
            </ControlTemplate>
        </MenuItem.Template>
      </MenuItem>
    </ContextMenu>
    

    您需要以下命名空间:

    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"                  
    xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions"
    

    【讨论】:

    • 我喜欢这个想法,但是您的示例无法正常工作,因为 TargetObject 不能是 ControlTemplate 之外的 ElementName,因此我为此使用了 RelativeSource。但是,我在最初的帖子中添加了一个没有 Blend 的解决方案。
    • 正确 - 使用 RelativeSource 更新答案(供将来参考...)
    猜你喜欢
    • 1970-01-01
    • 2011-07-28
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多