2008-08-13 11 views
25

Apparentemente quando gli utenti fanno clic con il pulsante destro del mouse nella nostra applicazione WPF e utilizzano il tema Windows classico, il ContextMenu predefinito del TextBox (che contiene Copia, Taglia e Incolla) ha uno sfondo nero.WPF: Come impostare o disattivare il ContextMenu predefinito di un TextBox

So che questo 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 stile o disabilitare di default per tutti i ContextMenu TextBoxes in WPF?

+0

Non avete bisogno di considerare disattivare i tasti di scelta rapida, per esempio CTRL-V? –

risposta

7

A causa di una segnalazione di bug in ritardo, abbiamo scoperto che non è possibile utilizzare ApplicationComands Cut Paste e Copia direttamente in un'applicazione parziale attendibile.Pertanto, l'utilizzo di questi comandi in qualsiasi comando dei controlli non eseguirà assolutamente nulla quando viene eseguito.

Quindi, in sostanza, la risposta di Brad era quasi arrivata, sicuramente sembrava il modo giusto, cioè senza uno sfondo nero, ma non risolveva il problema.

Abbiamo deciso di "rimuovere" il menù a base di Brad risposta, in questo modo:

<ContextMenu x:Key="TextBoxContextMenu" Width="0" Height="0" /> 

e utilizzare questo menu contestuale vuoto in questo modo:

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" /> 
</Style> 
+0

oppure potresti usare , che funziona anche. – joedotnot

+0

Inoltre, l'impostazione di 'IsEnabled' su ContextMenu su' false' evita il problema dello "stop" del focus quando l'utente tenta di fare clic con il pulsante destro del mouse. –

1

provare a rimuovere la x: chiave di attributo dalla risorsa Style, lasciando TargetType. Lo so, dovresti avere quel x: Key per una risorsa, ma se lo hai con il tuo TargetType prevale il Key.

Ecco uno stile di esempio che uso in un progetto per la pelle tutti i tooltip in una delle mie applicazioni (questo è in App.Resources - preavviso, senza chiave)

<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> 
1

non importa, se non si fornisce una chiave, si utilizzerà il TargetType come chiave alla stessa maniera, il mio esempio utilizza :)

Tratto da MSDN su Style:

l'impostazione della proprietà TargetType al TextBlock tipo senza impostare un x:Key imposta implicitamente il x:Key-{x:Type TextBlock}. Questo significa anche che se si>> Dare il sopra stile un valore x:Key di qualcosa di diverso {x:Type TextBlock}, lo stile non sarebbe applicata a tutti gli elementi TextBlock automaticamente. Invece, è necessario applicare lo stile agli elementi TextBlock in modo esplicito.

http://msdn.microsoft.com/en-us/library/system.windows.style.targettype.aspx

28

per lo stile ContextMenu di tutti TextBoxes, vorrei fare qualcosa di simile al seguente:

In primo luogo, nella sezione delle risorse, aggiungere un ContextMenu cui si prevede di utilizzare come standard di ContextMenu in una casella di testo.
ad es.

<ContextMenu x:Key="TextBoxContextMenu" Background="White"> 
    <MenuItem Command="ApplicationCommands.Copy" /> 
    <MenuItem Command="ApplicationCommands.Cut" /> 
    <MenuItem Command="ApplicationCommands.Paste" /> 
</ContextMenu> 

In secondo luogo, creare uno stile per le caselle di testo, che utilizza la risorsa menu contestuale:

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" /> 
</Style> 

Infine, usare la vostra casella di testo come di consueto:

<TextBox /> 

Se invece si desidera per applicare questo menu di scelta rapida solo ad alcune delle tue caselle di testo, non creare lo stile sopra riportato e aggiungi quanto segue al tuo markup TextBox:

<TextBox ContextMenu="{StaticResource TextBoxContextMenu}" /> 

Spero che questo aiuti!

+0

Mi dispiace inciampare in un bug .. Non l'ho mai capito, ma non posso usare ApplicationCommands Taglia, Copia e Incolla direttamente in un trust parziale .. Questo menu non funzionerà con un trust parziale. Cliccando sulla voce di menu, non fa assolutamente nulla .. Mi dispiace ci sono voluti quasi 18 mesi per scoprire;) – Arcturus

+0

La tua risposta mi ha portato alla mia nuova soluzione: disabilitare il menu con un menu vuoto .. Grazie ancora però per la tua risposta! – Arcturus

14

Bizarre. ContextMenu="{x:Null}" non fa il trucco.

Questo fa, però:

<TextBox.ContextMenu> 
    <ContextMenu Visibility="Collapsed"> 
    </ContextMenu> 
</TextBox.ContextMenu>