禁用整个上下文菜单

时间:2011-11-11 20:31:45

标签: wpf contextmenu

我知道有一种方法可以阻止或现在使用ContextMenuOpening事件显示上下文菜单。

但是我仍然希望显示上下文菜单,只是禁用其中的所有内容,有没有办法做到这一点?

如何同时禁用所有菜单项?

<DataTemplate x:Key="ItemDataTemplate">
        <Grid Background="Transparent">
            <Grid.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="New" Click="New_Click" />
                    <Separator />
                    <MenuItem Header="Duplicate" Click="Duplicate_Click"/>
                    <MenuItem Header="Delete" Click="Delete_Click"  />
                    <MenuItem Header="Rename" Click="Rename_Click" />
                    <Separator />
                    <MenuItem Header="Export..." Click="Export_Click" />                       
                    <MenuItem Header="Print..." Command="ApplicationCommands.Print" InputGestureText="" />
                    <Separator />
                    <MenuItem Header="Properties" Click="Properties_Click" />
                </ContextMenu>
            </Grid.ContextMenu>
            <StackPanel Orientation="Horizontal"
                        Margin="0,0,10,0"
                        HorizontalAlignment="Stretch"
                        Background="Transparent"
                        IsHitTestVisible="False">    
            </StackPanel>
        </Grid>    
    </DataTemplate>

6 个答案:

答案 0 :(得分:5)

IsEnabled = false上的

ContextMenu

编辑:由于在执行此操作时似乎存在关闭问题,我建议使用容器样式:

<ContextMenu>
    <ContextMenu.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="IsEnabled" Value="False"/>
        </Style>
    </ContextMenu.ItemContainerStyle>
    <MenuItem Header="Test"/>
</ContextMenu>

当然实际值也可以绑定,但在容器样式中,上下文是单个项,因此要绑定到父上下文,需要RelativeSource绑定(除非数据对象也有连接到父母)。

答案 1 :(得分:5)

        <Style x:Key="z3r0_Style_TextBox_Default" BasedOn="{x:Null}" TargetType="{x:Type TextBox}">
        <Setter Property="FontSize" Value="11"/>
        <Setter Property="Background" Value="{StaticResource z3r0_SolidColorBrush_DarkerGray}"/>
        <Setter Property="BorderBrush" Value="{x:Null}"/>
        <Setter Property="FontFamily" Value="Consolas"/>
        <Setter Property="Foreground" Value="{StaticResource z3r0_SolidColorBrush_Green}"/>
        <Setter Property="TextWrapping" Value="Wrap"/>
        <Setter Property="MinWidth" Value="10"/>
        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Setter Property="ContextMenu">                
            <Setter.Value>
                <ContextMenu IsEnabled="False" Visibility="Hidden">
                </ContextMenu>
            </Setter.Value>
        </Setter>

对我来说,将IsEnabled设置为False仍然会导致一个小的空上下文菜单可见。在更改其可见性属性后,它确实被禁用。

答案 2 :(得分:2)

通过将IsEnabled属性设置为false,可以在ContextMenu的根目录中禁用整个上下文菜单;无需循环遍历代码中的每个菜单项。

<ContextMenu IsEnabled="False">

或者

<ContextMenu IsEnabled={Binding Path=SomeModelBooleanProperty}">

这样可以查看上下文菜单,但所有项目都将被禁用。

答案 3 :(得分:1)

以下是我如何解决我的问题。

仍然使用ContextMenuOpening事件

使用循环

这就是为什么可以帮助我禁用代码中的某些上下文菜单项,但不能禁用xaml。

private void SetContextMenuItemsEnableStatus(object sender)
{
        FrameworkElement element = sender as FrameworkElement;
        if (element == null)
        {
            return;
        }

        ContextMenu contextMenu = element.ContextMenu;          
        if (contextMenu == null)
            return;
                    // use this way u can disable every item or certain item in context menu
        foreach (Control item in contextMenu.Items)
        {
                       item.IsEnabled = false;
        }
 }

答案 4 :(得分:0)

以下是我如何解决我的问题。

<ContextMenu x:Key="TreeViewEmptyContextMenu" Width="0" Height="0"/>

答案 5 :(得分:0)

我使用ContextMenu="{x:Null}"禁用TextBox中的上下文菜单。