WPF:Come definire o disabilitare lo stile del ContextMenu predefinito di un TextBox

StackOverflow https://stackoverflow.com/questions/9632

  •  08-06-2019
  •  | 
  •  

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?

È stato utile?

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à al TextBlock Digitare senza impostare un file x:Key imposta implicitamente il x:Key A {x:Type TextBlock}.Ciò significa anche che se > > dai allo stile sopra an x: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 al TextBlock 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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top