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

本文关键字:上下文 菜单 文本 启用 | 更新日期: 2023-09-27 18:24:51

我有一个TextBox。当它被启用时,我会得到一个很好的上下文菜单,包括剪切、复制和粘贴。

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

我试着将文本框包装在网格中,然后在该网格上应用上下文菜单。但这并没有什么区别。还有别的办法吗?

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

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

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

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

您可以在文本框上方放置隐藏标签(包含文本框文本)。

如果您的文本框被禁用,请取消隐藏标签,并使用弹出菜单显示您想要的任何内容。

启用文本框时,隐藏标签

编辑:

例如(我使用静态位置来简化它),如果你有一个坐标为(0,0,100,100)的文本框,在他上方添加一个坐标相同(0,00,100)隐藏(不可见)的标签。

联系人弹出菜单到标签,其中包含所需的所有选项(如"复制"、"导出"等)。

现在,如果用户点击文本框,他应该会收到所有文本框选项,但如果文本框被禁用,用户应该点击标签,而不是文本框,因此他应该收到你用弹出菜单决定的内容。

注意我不记得你是否可以滚动标签。不管怎样,你可以把标签放在布局中,它就像一个文本框(带滚动…)