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

时间:2014-09-29 07:09:34

标签: c# wpf

我有一个TextBox。启用后,我会得到一个具有剪切,复制和粘贴的良好上下文菜单。

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

我尝试将TextBox包装在Grid中,然后在该Grid上应用了Context Menu。但它没有区别。还有其他办法吗?

2 个答案:

答案 0 :(得分:4)

您可以使用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>

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

答案 1 :(得分:1)

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

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

启用文本框时,隐藏标签

修改

例如(我使用静态位置使其变得容易),如果您有一个具有此坐标(0,0,100,100)的文本框,请在其上方添加一个隐藏(不可见)标签,并使用相同的坐标(0 ,0,100,100)。

使用所需的所有选项(例如复制,导出等)联系弹出菜单到标签。

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

注意我不记得你是否可以滚动标签。无论如何,您可以将标签放在布局中,它就像一个文本框(带滚动...)