启用和禁用文本框的不同上下文菜单

Vis*_*hal 2 c# wpf

我有一个文本框。启用后,我会得到一个很好的上下文菜单,其中包含剪切、复制和粘贴。

现在,当 TextBox 被禁用时,我想要一个不同的上下文菜单。我的意思是 contextMenu 应该只有 1 个选项,即复制。

我尝试将文本框包装在网格内,然后在该网格上应用了上下文菜单。但这没有什么区别。还有其他办法吗?

Adr*_*ciu 5

您可以使用TextBox 的IsReadOnly属性而不是禁用它。这将处理上下文菜单,这意味着唯一启用的选项将是“复制”。

禁用 TextBox 将告诉用户它无法与它交互,如果它是只读的,它的视觉样式略有不同,表明它仍然可以与之交互。

编辑

如果您处于 MVVM 场景中并且希望 ContextMenu 中包含动态项,只需将 ContextMenu 的 ItemsSource 绑定到您可以根据需要修改的集合。

编辑2

要从 xaml 修复此问题,您只需将所有项目添加到同一个 ContextMenu 并为 MenuItem 创建一个样式,该样式将根据父级的 IsEnabled 属性隐藏它们:

    <Style TargetType="MenuItem" x:Key="menuItemStyle">
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TextBox}}, Path=IsEnabled}" Value="True">
                <Setter Property="Visibility" Value="Collapsed"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
Run Code Online (Sandbox Code Playgroud)

要在禁用的项目上显示上下文菜单,您可以使用:ContextMenuService.ShowOnDisabled="True"

  • @Vishal也许你应该详细说明你到底想要做什么,因为阿德里安是对的:如果它被禁用,你不应该与它交互。必须有一种更用户友好的方式来实现您想要的。 (2认同)