WPF:So formatieren oder deaktivieren Sie das Standard-ContextMenu einer TextBox
Frage
Wenn Benutzer in unserer WPF-Anwendung mit der rechten Maustaste klicken und das klassische Windows-Design verwenden, hat das Standard-Kontextmenü der TextBox (das Kopieren, Ausschneiden und Einfügen enthält) offenbar einen schwarzen Hintergrund.
Ich weiß, dass das gut funktioniert:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<TextBox ContextMenu="{x:Null}"/>
</Page>
Aber das funktioniert nicht:
<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>
Weiß jemand, wie man das Standard-Kontextmenü für alle TextBoxen in WPF formatiert oder deaktiviert?
Lösung 3
Aufgrund eines späten Fehlerberichts haben wir festgestellt, dass wir die ApplicationComands „Ausschneiden, Einfügen“ und „Kopieren“ nicht direkt in einer teilweise vertrauenswürdigen Anwendung verwenden können.Daher führt die Verwendung dieser Befehle in einem beliebigen Befehl Ihrer Steuerelemente bei der Ausführung zu absolut nichts.
Im Wesentlichen war Brads Antwort also fast da, sie sah auf jeden Fall richtig aus, d. h.kein schwarzer Hintergrund, aber das Problem wurde nicht behoben.
Wir haben uns entschieden, das Menü basierend auf Brads Antwort zu „entfernen“, etwa so:
<ContextMenu x:Key="TextBoxContextMenu" Width="0" Height="0" />
Und verwenden Sie dieses leere Kontextmenü wie folgt:
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
Andere Tipps
Um ContextMenus für alle TextBoxen zu formatieren, würde ich etwa Folgendes tun:
Fügen Sie zunächst im Abschnitt „Ressourcen“ ein Kontextmenü hinzu, das Sie als Standard-Kontextmenü in einem Textfeld verwenden möchten.
z.B.
<ContextMenu x:Key="TextBoxContextMenu" Background="White">
<MenuItem Command="ApplicationCommands.Copy" />
<MenuItem Command="ApplicationCommands.Cut" />
<MenuItem Command="ApplicationCommands.Paste" />
</ContextMenu>
Zweitens erstellen Sie einen Stil für Ihre TextBoxen, der die Kontextmenüressource verwendet:
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
Zum Schluss verwenden Sie Ihr Textfeld wie gewohnt:
<TextBox />
Wenn Sie dieses Kontextmenü stattdessen nur auf einige Ihrer Textfelder anwenden möchten, erstellen Sie nicht den oben genannten Stil und fügen Sie Folgendes zu Ihrem TextBox-Markup hinzu:
<TextBox ContextMenu="{StaticResource TextBoxContextMenu}" />
Hoffe das hilft!
Bizarr. ContextMenu="{x:Null}"
reicht nicht aus.
Dies bedeutet jedoch:
<TextBox.ContextMenu>
<ContextMenu Visibility="Collapsed">
</ContextMenu>
</TextBox.ContextMenu>
Versuchen Sie, das x:Key-Attribut aus der Style-Ressource zu entfernen und TargetType beizubehalten.Ich weiß, dass Sie diesen x:Key für eine Ressource haben sollten, aber wenn Sie ihn zusammen mit Ihrem TargetType haben, hat der Key Vorrang.
Hier ist ein Beispielstil, den ich in einem Projekt verwende, um alle Tooltips in einer meiner Apps zu gestalten (dies ist in App.Resources – Hinweis, kein Schlüssel).
<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>
Egal, wenn Sie keinen Schlüssel angeben, wird der verwendet TargetType
als Schlüssel genau so, wie mein Beispiel es verwendet :)
Entnommen aus MSDN im Stil:
Einstellen der
TargetType
Eigentum an dieTextBlock
Geben Sie ein, ohne ein festzulegenx:Key
legt implizit die festx:Key
Zu{x:Type TextBlock}
.Dies bedeutet auch, dass Sie dem oben genannten Stil eine gebenx:Key
Wert von etwas anderem als{x:Type TextBlock}
, Der Stil würde nicht automatisch auf alle Textblockelemente angewendet.Stattdessen müssen Sie den Stil auf die anwendenTextBlock
Elemente explizit.
http://msdn.microsoft.com/en-us/library/system.windows.style.targettype.aspx
Diesen Weg verwende ich immer:
<TextBox x:Name="MyTextbox">
<TextBox.ContextMenu>
<ContextMenu Visibility="Hidden"/>
</TextBox.ContextMenu>
</TextBox>
Und kann auch Folgendes verwenden:
MyTextbox.ContextMenu.Visibility = Visibility.Hidden;
MyTextbox.ContextMenu.Visibility = Visibility.Visble;