WPF:So formatieren oder deaktivieren Sie das Standard-ContextMenu einer TextBox

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

  •  08-06-2019
  •  | 
  •  

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?

War es hilfreich?

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 die TextBlock Geben Sie ein, ohne ein festzulegen x:Key legt implizit die fest x:Key Zu {x:Type TextBlock}.Dies bedeutet auch, dass Sie dem oben genannten Stil eine geben x: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 anwenden TextBlock 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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top