C# Contextmenu StaysOpen属性根本不起作用

C# Contextmenu StaysOpen属性根本不起作用,c#,wpf,C#,Wpf,我对contextmenu有一个非常奇怪的问题。考虑这个简单的代码: <StackPanel> <StackPanel.ContextMenu> <ContextMenu x:Name="CMenu" StaysOpen="True" > <MenuItem Header="Item 1" /> <MenuItem Header="Item 2">

我对contextmenu有一个非常奇怪的问题。考虑这个简单的代码:

<StackPanel>
    <StackPanel.ContextMenu>
        <ContextMenu x:Name="CMenu" StaysOpen="True" >
            <MenuItem Header="Item 1" />
            <MenuItem Header="Item 2">
                <MenuItem Header="Sub item 1" />
                <MenuItem Header="Sub item 2" />
                <MenuItem Header="Sub item 3" />
                <MenuItem Header="Sub item 4" />
            </MenuItem>
            <MenuItem Header="Item 3" />
            <MenuItem Header="Item 4" />
        </ContextMenu>
    </StackPanel.ContextMenu>
    <Label Content="ContextMenu Test" />
    <Button Content="ClickMe" Click="Button_Click" />
</StackPanel>


但是,只要单击上下文菜单之外的任何位置,我就会将staysopen设置为true。这房子是做什么用的?如何防止contextmenu关闭?(单击clickme按钮跟踪StaysOpen状态,它始终为真)

我想您需要改用Popup:

 <StackPanel>
        <Popup IsOpen="True"
               StaysOpen="True"
               PlacementTarget="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Panel}}}">
            <ListBox>
                <ListBoxItem Content="1" />
                <ListBoxItem Content="2" />
            </ListBox>
        </Popup>
        <Label Content="ContextMenu Test" />
        <Button Content="ClickMe" />
    </StackPanel>


不过,您应该根据窗口的移动来注意此弹出窗口的位置。意味着重新定义其X和Y。我想您需要使用弹出窗口:

 <StackPanel>
        <Popup IsOpen="True"
               StaysOpen="True"
               PlacementTarget="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Panel}}}">
            <ListBox>
                <ListBoxItem Content="1" />
                <ListBoxItem Content="2" />
            </ListBox>
        </Popup>
        <Label Content="ContextMenu Test" />
        <Button Content="ClickMe" />
    </StackPanel>


不过,您应该根据窗口的移动来注意此弹出窗口的位置。意味着重新定义其X和Y。

若要在单击后仍保持菜单打开,则必须为每个菜单项将“下属性”设置为true

StaysOpenOnClick="True"
因此,对于您的需求,您的代码如下所示:

<StackPanel>
        <StackPanel.ContextMenu>
            <ContextMenu x:Name="CMenu" StaysOpen="True" >
                                       <MenuItem Header="Item 1" StaysOpenOnClick="True"/>
                    <MenuItem Header="Item 2" StaysOpenOnClick="True">
                        <MenuItem Header="Sub item 1" StaysOpenOnClick="True"/>
                        <MenuItem Header="Sub item 2" StaysOpenOnClick="True"/>
                        <MenuItem Header="Sub item 3" StaysOpenOnClick="True"/>
                        <MenuItem Header="Sub item 4" StaysOpenOnClick="True"/>
                    </MenuItem>
                    <MenuItem Header="Item 3" StaysOpenOnClick="True"/>
                    <MenuItem Header="Item 4" StaysOpenOnClick="True"/>

            </ContextMenu>
        </StackPanel.ContextMenu>
        <Label Content="ContextMenu Test" />
        <Button Content="ClickMe" Click="Button_Click" />
    </StackPanel>

要在单击后仍保持菜单打开,您必须为每个菜单项将下面的属性设置为true

StaysOpenOnClick="True"
因此,对于您的需求,您的代码如下所示:

<StackPanel>
        <StackPanel.ContextMenu>
            <ContextMenu x:Name="CMenu" StaysOpen="True" >
                                       <MenuItem Header="Item 1" StaysOpenOnClick="True"/>
                    <MenuItem Header="Item 2" StaysOpenOnClick="True">
                        <MenuItem Header="Sub item 1" StaysOpenOnClick="True"/>
                        <MenuItem Header="Sub item 2" StaysOpenOnClick="True"/>
                        <MenuItem Header="Sub item 3" StaysOpenOnClick="True"/>
                        <MenuItem Header="Sub item 4" StaysOpenOnClick="True"/>
                    </MenuItem>
                    <MenuItem Header="Item 3" StaysOpenOnClick="True"/>
                    <MenuItem Header="Item 4" StaysOpenOnClick="True"/>

            </ContextMenu>
        </StackPanel.ContextMenu>
        <Label Content="ContextMenu Test" />
        <Button Content="ClickMe" Click="Button_Click" />
    </StackPanel>


Hmm:@EdPlunkett我的情况不同。单击菜单项时,我不希望contextmenu保持打开状态。可以关门了。我只是不想当我在菜单内容之外单击时菜单关闭。这是相同的意思:你需要避免关闭并保持它打开。当您需要手动打开和关闭它时,请使用Popup和control。我将创建一个辅助窗口(基本相同),而不是ContextMenu,以确保将“Owner”属性设置为主窗口(或其他任何窗口)。您的案例是典型的“无模式”(如果允许外部交互)或“模式”(前台窗口必须关闭时)。嗯:@EdPlunkett我的案例不同。单击菜单项时,我不希望contextmenu保持打开状态。可以关门了。我只是不想当我在菜单内容之外单击时菜单关闭。这是相同的意思:你需要避免关闭并保持它打开。当您需要手动打开和关闭它时,请使用Popup和control。我将创建一个辅助窗口(基本相同),而不是ContextMenu,以确保将“Owner”属性设置为主窗口(或其他任何窗口)。您的案例是典型的“无模式”(如果允许外部交互)或“模式”(当前台窗口必须关闭时)。我已经考虑过使用弹出窗口,但我希望它看起来像一个真正的contextmenu,因为我使用自定义样式的contextmenu,我不想乱来。这里没有选择。您必须从弹出窗口实现您自己的“上下文菜单”,因为原始上下文菜单是为关闭而构建的。那么上下文菜单上的StaysOpen属性的用途是什么?我遗漏了什么吗?我已经考虑过使用弹出窗口,但我希望它看起来像一个真正的contextmenu,而且因为我使用自定义样式的contextmenu,我不想乱来。这里没有选择。您必须从弹出窗口实现您自己的“上下文菜单”,因为原始上下文菜单是为关闭而构建的。那么上下文菜单上的StaysOpen属性的用途是什么?我遗漏了什么吗?将菜单项上的StaysOpenOnClick设置为true可防止在单击该菜单项时关闭关联菜单,并在单击关联菜单外部时仍然关闭。将菜单项上的StaysOpenOnClick设置为true可防止在单击该菜单项时关闭关联菜单,并在单击外部时仍然关闭关联菜单上下文菜单的。