Очевидно, когда пользователи щелкают правой кнопкой мыши в нашем приложении WPF и используют классическую тему Windows, по умолчанию ContextMenu TextBox (который содержит Copy, Cut и Paste) имеет черный фон.
Я знаю, это хорошо работает:
<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>
Кто-нибудь знает, как стилизовать или отключить стандартное ContextMenu для всех TextBox в WPF?
Попробуйте удалить атрибут x: Key из ресурса Style, оставив 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}
. Это также означает, что если вы>> присвоите вышеуказанному стилюx:Key
значение, отличное от этого{x:Type TextBlock}
, стиль не будет применен ко всем элементам TextBlock автоматически. Вместо этого вам нужноTextBlock
явно применить стиль к элементам.
http://msdn.microsoft.com/en-us/library/system.windows.style.targettype.aspx
Чтобы стилизовать ContextMenu для всех TextBox, я бы сделал что-то вроде следующего:
Сначала в разделе ресурсов добавьте 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}" />
Надеюсь это поможет!
Из-за позднего сообщения об ошибке мы обнаружили, что мы не можем напрямую использовать вставку и копирование ApplicationComands в частично доверенном приложении. Таким образом, использование этих команд в любой команде ваших элементов управления при выполнении будет абсолютно ничего не делать.
Так что, по сути, ответ Брэдса был почти там, он, конечно, выглядел правильно, то есть без черного фона, но не решал проблему.
Мы решили «удалить» меню, основываясь на ответе Брэда, примерно так:
<ContextMenu x:Key="TextBoxContextMenu" Width="0" Height="0" />
И используйте это пустое контекстное меню так:
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
IsEnabled
ContextMenu false
позволяет избежать проблемы «зависания» фокуса, когда пользователь пытается щелкнуть правой кнопкой мыши. Bizarre. ContextMenu="{x:Null}"
не делает трюк.
Это делает, однако:
<TextBox.ContextMenu>
<ContextMenu Visibility="Collapsed">
</ContextMenu>
</TextBox.ContextMenu>
Это то, что я всегда использую:
<TextBox x:Name="MyTextbox">
<TextBox.ContextMenu>
<ContextMenu Visibility="Hidden"/>
</TextBox.ContextMenu>
</TextBox>
А также можете использовать:
MyTextbox.ContextMenu.Visibility = Visibility.Hidden;
MyTextbox.ContextMenu.Visibility = Visibility.Visble;