Отключить все контекстное меню - PullRequest
3 голосов
/ 12 ноября 2011

Я знаю, что есть способ блокировать или теперь показывать контекстное меню с помощью события 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 ]

5 голосов
/ 01 сентября 2014
        <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 по-прежнему приводила к появлению небольшого пустого контекстного меню. После изменения атрибута видимости он был действительно отключен.

5 голосов
/ 12 ноября 2011

IsEnabled = false на ContextMenu?

Редактировать: Поскольку при этом возникают проблемы с закрытием, я бы предложил стиль контейнера:

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

Конечно, фактическое значение также может быть связано, но в стиле контейнера контекст является отдельным элементом, поэтому для привязки к родительскому контексту необходимо связывание RelativeSource (если только объект данных также не являетсяимеет связь с родителем).

2 голосов
/ 29 января 2013

Все контекстное меню можно отключить в корне ContextMenu, установив для свойства IsEnabled значение false;нет необходимости циклически проходить через каждый пункт меню в коде.

<ContextMenu IsEnabled="False">

или

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

Это позволит просматривать контекстное меню, но все элементы будут отключены.

1 голос
/ 29 ноября 2011

Вот как я решаю свой вопрос.

Все еще используется событие 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;
        }
 }
0 голосов
/ 17 января 2017

Я использовал ContextMenu="{x:Null}", чтобы отключить контекстное меню в TextBox.

0 голосов
/ 18 марта 2016

Вот как я решаю свой вопрос.

<ContextMenu x:Key="TreeViewEmptyContextMenu" Width="0" Height="0"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...