为用户无法选择的上下文菜单添加标题

本文关键字:上下文 菜单 添加 标题 选择 用户 | 更新日期: 2023-09-27 18:18:56

我正在尝试添加标题到上下文菜单。下面的xaml几乎可以满足我的需要。问题是用户可以选择TextBlock,如果他们点击TextBlock,菜单就会消失。(如果用户单击分隔符,则菜单保留。)所以基本上我想要TextBlock不突出显示,如果用户移动他们的鼠标在它,我也不希望菜单消失,如果用户点击TextBlock。

<TextBlock.ContextMenu>
    <ContextMenu>
        <TextBlock Text="Test!!!" />
        <Separator></Separator>
        <MenuItem Header="menu item1" />
        <MenuItem Header="menu item2" />
    </ContextMenu>
</TextBlock.ContextMenu>

为用户无法选择的上下文菜单添加标题

您可以在分隔符上使用自定义模板来实现您想要的效果

<TextBlock.ContextMenu>
    <ContextMenu>
        <Separator>
            <Separator.Template>
                <ControlTemplate TargetType="Separator">
                    <StackPanel>
                        <TextBlock Text="Test!!!" />
                        <Separator/>
                    </StackPanel>
                </ControlTemplate>
            </Separator.Template>
        </Separator>
        <MenuItem Header="menu item1" />
        <MenuItem Header="menu item2" />
    </ContextMenu>
</TextBlock.ContextMenu>

这样,文本不会响应点击或悬停,并保持菜单打开,而且如果你把模板变成资源,你可以重用。

如果您只是想在ContextMenu中的Separator上方添加一些空间,那么习惯上使用Margin属性。由于有四个输入值,我们只需要设置"up"值。试试这个:

<TextBlock Text="{Binding SomeTextField}">
    <TextBlock.ContextMenu>
        <ContextMenu>
            <Separator Margin="0,25,0,0"></Separator>
            <MenuItem Header="menu item1" />
            <MenuItem Header="menu item2" />
        </ContextMenu>
    </TextBlock.ContextMenu>
</TextBlock>

试试这个

        <Style TargetType="{x:Type ContextMenu}">
        <Setter Property="SnapsToDevicePixels" Value="True" />
        <Setter Property="OverridesDefaultStyle" Value="True" />
        <Setter Property="Grid.IsSharedSizeScope" Value="true" />
        <Setter Property="HasDropShadow" Value="True" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ContextMenu}">
                    <Border x:Name="Border"  Background="White"  BorderThickness="1" BorderBrush="Gray">
                        <StackPanel>
                            <TextBlock Text="Test!!!!"/>
                            <Separator></Separator>
                        <StackPanel 
                            IsItemsHost="True"
                            KeyboardNavigation.DirectionalNavigation="Cycle" />
                        </StackPanel>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="HasDropShadow" Value="true">
                            <Setter TargetName="Border" Property="Padding" Value="0,3,0,3" />
                            <Setter TargetName="Border" Property="CornerRadius" Value="4" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>