WPF:Come definire o disabilitare lo stile del ContextMenu predefinito di un TextBox
Domanda
Apparentemente quando gli utenti fanno clic con il pulsante destro del mouse sulla nostra applicazione WPF e utilizzano il tema Windows Classic, il menu contestuale predefinito della casella di testo (che contiene Copia, Taglia e Incolla) ha uno sfondo nero.
So che funziona bene:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<TextBox ContextMenu="{x:Null}"/>
</Page>
Ma questo non funziona:
<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>
Qualcuno sa come definire o disabilitare il ContextMenu predefinito per tutte le caselle di testo in WPF?
Soluzione 3
A causa di una segnalazione tardiva di bug abbiamo scoperto che non è possibile utilizzare i comandi Taglia, Incolla e Copia dell'applicazione direttamente in un'applicazione parzialmente attendibile.Pertanto, l'utilizzo di questi comandi in qualsiasi comando dei tuoi controlli non farà assolutamente nulla una volta eseguito.
Quindi, in sostanza, la risposta di Brad era quasi arrivata, sicuramente sembrava nel modo giusto, ad es.nessuno sfondo nero, ma non ha risolto il problema.
Abbiamo deciso di "rimuovere" il menu in base alla risposta di Brad, in questo modo:
<ContextMenu x:Key="TextBoxContextMenu" Width="0" Height="0" />
E usa questo menu contestuale vuoto in questo modo:
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
Altri suggerimenti
Per definire lo stile dei ContextMenu per tutte le caselle di testo, farei qualcosa di simile al seguente:
Innanzitutto, nella sezione risorse, aggiungi un ContextMenu che prevedi di utilizzare come ContextMenu standard in una casella di testo.
per esempio.
<ContextMenu x:Key="TextBoxContextMenu" Background="White">
<MenuItem Command="ApplicationCommands.Copy" />
<MenuItem Command="ApplicationCommands.Cut" />
<MenuItem Command="ApplicationCommands.Paste" />
</ContextMenu>
In secondo luogo, crea uno stile per le tue caselle di testo, che utilizza la risorsa del menu contestuale:
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>
Infine, utilizza la casella di testo normalmente:
<TextBox />
Se invece vuoi applicare questo menu contestuale solo ad alcune delle tue caselle di testo, non creare lo stile sopra e aggiungi quanto segue al markup della tua casella di testo:
<TextBox ContextMenu="{StaticResource TextBoxContextMenu}" />
Spero che questo ti aiuti!
Bizzarro. ContextMenu="{x:Null}"
non fa il trucco.
Ciò, tuttavia:
<TextBox.ContextMenu>
<ContextMenu Visibility="Collapsed">
</ContextMenu>
</TextBox.ContextMenu>
Prova a rimuovere l'attributo x:Key dalla risorsa Style, lasciando TargetType.Lo so, dovresti avere x:Key per una risorsa, ma se lo hai insieme al tuo TargetType, la chiave prevale.
Ecco uno stile di esempio che utilizzo in un progetto per applicare l'aspetto di tutte le descrizioni comandi in una delle mie app (questo è in App.Resources--notice, no Key)
<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>
Non importa, se non fornisci una chiave, utilizzerà il file TargetType
come chiave proprio nello stesso modo in cui usa il mio esempio :)
Tratto da MSDN su Style:
Impostazione del
TargetType
proprietà alTextBlock
Digitare senza impostare un filex:Key
imposta implicitamente ilx:Key
A{x:Type TextBlock}
.Ciò significa anche che se > > dai allo stile sopra anx:Key
valore di qualsiasi cosa diversa da{x:Type TextBlock}
, lo stile non verrebbe applicato automaticamente a tutti gli elementi del blocco di testo.Invece, devi applicare lo stile alTextBlock
elementi in modo esplicito.
http://msdn.microsoft.com/en-us/library/system.windows.style.targettype.aspx
Questo è il modo che uso sempre:
<TextBox x:Name="MyTextbox">
<TextBox.ContextMenu>
<ContextMenu Visibility="Hidden"/>
</TextBox.ContextMenu>
</TextBox>
E può anche usare:
MyTextbox.ContextMenu.Visibility = Visibility.Hidden;
MyTextbox.ContextMenu.Visibility = Visibility.Visble;