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

5

我正在尝试为上下文菜单添加标题。以下XAML几乎可以满足我的需求。问题在于用户可以选择TextBlock,如果他们单击Textblock,则菜单会消失。(如果用户单击分隔符,则菜单仍然存在。)因此,基本上我希望如果用户将鼠标移动到TextBlock上,则不要突出显示TextBlock,并且如果用户单击TextBlock,则菜单也不会消失。

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

IsHitTestVisible=false应该使其无法被点击。虽然,我相信您仍然可以使用键盘来选择它。也许Focusable=False? - Lee O.
你实际上想要实现什么?你的最终目标是什么? - Sheridan
我想要一个标题,用户无法使用鼠标选择或突出显示其中的文本。如果他们单击它,它不会导致菜单消失。默认情况下,Focusable设置为false。IsHitTestVisible=false没有产生明显的效果。 - ashlar64
3个回答

7
您可以使用自定义模板来实现所需的效果。
<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>

通过这种方式,文本不会对单击或悬停做出响应,并保持菜单打开状态,另外,如果您将模板转换为资源,则可以重复使用它。


嗨,谢谢你的回复。这个也可以。现在我得在你的答案和ethicallogics之间做出选择了。 - ashlar64
这是一个不错的解决方案,但“内部”分隔符会被绘制为全宽黑线,而不是上下文菜单内分隔符的正常样式。但是,您可以使用<Separator Style="{StaticResource {x:Static MenuItem.SeparatorStyleKey}}" />来修复它。您还需要在TextBlock上至少使用Margin="32,0,8,0" - Miral

1
如果您只想在上下文菜单中的分隔符上方添加一些空间,则通常使用Margin属性。由于有四个输入值,我们只需要设置“向上”值。请尝试以下内容:
<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>

1

试试这个

        <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>

这正是我所需要的!非常感谢你的帮助! - ashlar64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接