当用户右键单击我们的WPF应用程序并且他们使用Windows经典主题时,TextBox的默认ContextMenu(包含复制,剪切和粘贴)具有黑色背景。
我知道这很有效:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<TextBox ContextMenu="{x:Null}"/>
</Page>
但这不起作用:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{x:Null}"/>
</Style>
</Page.Resources>
<TextBox/>
</Page>
有没有人知道如何为WPF中的所有TextBox设置样式或禁用默认的ContextMenu?
答案 0 :(得分:29)
要为所有TextBox设置ContextMenu的样式,我会执行以下操作:
首先,在资源部分,添加一个您计划在文本框中用作标准ContextMenu的ContextMenu。例如
<ContextMenu x:Key="TextBoxContextMenu" Background="White">
<MenuItem Command="ApplicationCommands.Copy" />
<MenuItem Command="ApplicationCommands.Cut" />
<MenuItem Command="ApplicationCommands.Paste" />
</ContextMenu>
其次,为TextBoxes创建一个样式,它使用上下文菜单资源:
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
最后,正常使用您的文本框:
<TextBox />
如果您想将此上下文菜单仅应用于某些文本框,请不要创建上面的样式,并将以下内容添加到TextBox标记中:
<TextBox ContextMenu="{StaticResource TextBoxContextMenu}" />
希望这有帮助!
答案 1 :(得分:14)
怪异。 ContextMenu="{x:Null}"
没有做到这一点。
但是这样做:
<TextBox.ContextMenu>
<ContextMenu Visibility="Collapsed">
</ContextMenu>
</TextBox.ContextMenu>
答案 2 :(得分:7)
由于后期错误报告,我们发现我们无法在部分受信任的应用程序中直接使用ApplicationComands Cut Paste和Copy。因此,在控件的任何Commmand中使用这些命令在执行时绝对不会执行任何操作。
所以从本质上来说Brads的答案几乎就在那里,它确实看起来是正确的方式,即没有黑色背景,但没有解决问题。
我们决定根据Brads的答案“删除”菜单,如下:
<ContextMenu x:Key="TextBoxContextMenu" Width="0" Height="0" />
并像这样使用这个空的上下文菜单:
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
答案 3 :(得分:1)
尝试从Style资源中删除x:Key属性,保留TargetType。我知道,你应该拥有x:资源的密钥,但是如果你将它与你的TargetType一起使用,则密钥占优势。
这是我在项目中使用的示例样式,用于在我的一个应用程序中为所有工具提示设置外观(这是在App.Resources中 - 注意,没有密钥)
<Style
TargetType="{x:Type ToolTip}">
<Setter
Property="Template">
<Setter.Value>
<ControlTemplate
TargetType="{x:Type ToolTip}">
<Grid
Width="{TemplateBinding Width}"
Height="{TemplateBinding Height}">
<Rectangle
RadiusX="9"
RadiusY="9"
Stroke="LightGray"
StrokeThickness="2">
<Rectangle.Fill>
<RadialGradientBrush>
<GradientStop />
<GradientStop
Color="FloralWhite"
Offset="0" />
<GradientStop
Color="Cornsilk"
Offset="2" />
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
<ContentPresenter
Margin="6 4 6 4" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
答案 4 :(得分:1)
无关紧要,如果您不提供密钥,它将使用TargetType
作为密钥,就像我的示例使用的那样:)
来自MSDN的风格:
将
TargetType
属性设置为TextBlock
类型而不用 设置x:Key
会隐式将x:Key
设置为{x:Type TextBlock}
。这也意味着如果你&gt; &GT;给上面的Style赋予x:Key
除{x:Type TextBlock}
以外的任何值的样式 不会自动应用于所有TextBlock元素。代替, 您需要明确地将样式应用于TextBlock
元素。
http://msdn.microsoft.com/en-us/library/system.windows.style.targettype.aspx
答案 5 :(得分:0)
这就是我一直使用的方式:
<TextBox x:Name="MyTextbox">
<TextBox.ContextMenu>
<ContextMenu Visibility="Hidden"/>
</TextBox.ContextMenu>
</TextBox>
也可以使用:
MyTextbox.ContextMenu.Visibility = Visibility.Hidden;
MyTextbox.ContextMenu.Visibility = Visibility.Visble;