题
显然,当用户在我们的 WPF 应用程序中右键单击并使用 Windows 经典主题时,文本框的默认上下文菜单(包含复制、剪切和粘贴)具有黑色背景。
我知道这很有效:
<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 中的所有文本框设置样式或禁用默认上下文菜单?
解决方案 3
由于最近的错误报告,我们发现我们无法在部分受信任的应用程序中直接使用 ApplicationComands 剪切粘贴和复制。因此,在控件的任何命令中使用这些命令在执行时绝对不会执行任何操作。
所以本质上布拉德的答案几乎就在那里,它看起来确实是正确的方式,即没有黑色背景,但没有解决问题。
我们决定根据布拉德的回答“删除”菜单,如下所示:
<ContextMenu x:Key="TextBoxContextMenu" Width="0" Height="0" />
并像这样使用这个空的上下文菜单:
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
其他提示
要为所有文本框设置 ContextMenu 的样式,我会执行如下操作:
首先,在资源部分中,添加一个您计划在文本框中用作标准上下文菜单的上下文菜单。
例如
<ContextMenu x:Key="TextBoxContextMenu" Background="White">
<MenuItem Command="ApplicationCommands.Copy" />
<MenuItem Command="ApplicationCommands.Cut" />
<MenuItem Command="ApplicationCommands.Paste" />
</ContextMenu>
其次,为您的文本框创建一个样式,它使用上下文菜单资源:
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
最后,照常使用文本框:
<TextBox />
如果您只想将此上下文菜单应用于某些文本框,请不要创建上面的样式,并将以下内容添加到您的 TextBox 标记中:
<TextBox ContextMenu="{StaticResource TextBoxContextMenu}" />
希望这可以帮助!
奇怪的。 ContextMenu="{x:Null}"
没有成功。
然而,这确实:
<TextBox.ContextMenu>
<ContextMenu Visibility="Collapsed">
</ContextMenu>
</TextBox.ContextMenu>
尝试从 Style 资源中删除 x:Key 属性,保留 TargetType。我知道,您应该拥有资源的 x:Key,但如果您将它与 TargetType 一起使用,则以 Key 为准。
这是我在项目中使用的示例样式,用于为我的一个应用程序中的所有工具提示设置外观(位于 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>
没关系,如果您不提供密钥,它将使用 TargetType
作为密钥,就像我的示例使用的方式一样:)
摘自 MSDN 关于样式的内容:
设置
TargetType
财产给TextBlock
不设置x:Key
隐式设置x:Key
到{x:Type TextBlock}
. 。这也意味着如果您 >> 给上面的 Style 一个x:Key
除{x:Type TextBlock}
, ,该样式不会自动应用于所有TextBlock元素。相反,您需要将样式应用于TextBlock
明确的元素。
http://msdn.microsoft.com/en-us/library/system.windows.style.targettype.aspx
这是我经常使用的方法:
<TextBox x:Name="MyTextbox">
<TextBox.ContextMenu>
<ContextMenu Visibility="Hidden"/>
</TextBox.ContextMenu>
</TextBox>
并且还可以使用:
MyTextbox.ContextMenu.Visibility = Visibility.Hidden;
MyTextbox.ContextMenu.Visibility = Visibility.Visble;