2014-09-29 88 views
1

我有一个文本框。当它启用时,我会得到一个具有剪切,复制和粘贴功能的上下文菜单。启用和禁用文本框的不同上下文菜单

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

我试图将文本框包裹在网格中,然后我在该网格上应用上下文菜单。但它没有区别。有没有其他方法?

+0

那些谁标记这个问题否定的,请关注评论。 – Vishal 2014-09-29 07:14:00

回答

1

你可以把一个隐藏的标签(包含文本框的文本)文本框的上方。

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

当您启用文本框,隐藏标签

编辑:

例如(我使用静态的位置,以方便),如果你有一个文本框与此坐标(0,0 ,100,100),用相同的坐标(0,0,100,100)在他上面添加一个隐藏的(不可见的)标签。

联系弹出菜单标签与所有你想要的选项(如复制,导出,无论)。

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

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

+0

你能详细点吗? – Vishal 2014-09-29 07:33:35

+0

谢谢。我已经整理出修复,然后使用你的技巧,效果很好。 – Vishal 2014-09-29 10:44:21

+0

:)享受和祝你好运 – AsfK 2014-09-29 10:45:51

4

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

禁用TextBox会告诉用户它不能与它进行交互,如果它是只读的,它具有略微不同的视觉风格,表明它仍然可以与之交互。

编辑

如果你在一个MVVM方案,并希望在文本菜单的动态项目仅仅是文本菜单的的ItemsSource绑定到一个集合根据需要,你可以修改。

编辑2

从XAML解决这个问题只有你的所有项目添加到同一文本菜单和菜单项,将基于父的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

我无法使用IsReadOnly。我必须使它成为Disabled。因为我也在处理拖放操作。 – Vishal 2014-09-29 07:21:52

+0

另外,我刚刚给了一个副本的例子。但我想为禁用的文本框有不同的选项。 – Vishal 2014-09-29 07:23:23

+2

@Vishal也许你应该详细说明你正在尝试做什么,因为Adrian是正确的:如果它被禁用,你不应该与它互动。必须有一种更加用户友好的方式来实现你想要的。 – 2014-09-29 07:27:27