Подтвердить что ты не робот

WPF: как стилизовать или отключить стандартное ContextMenu текстового поля

Очевидно, когда пользователи щелкают правой кнопкой мыши в нашем приложении WPF, и они используют тему Windows Classic, ContextMenu по умолчанию для TextBox (который содержит Copy, Cut и Paste) имеет черный фон.

Я знаю, что это хорошо работает:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <TextBox ContextMenu="{x:Null}"/>

</Page>

Но это не работает:

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

Кто-нибудь знает, как стилизовать или отключить стандартный ContextMenu для всех текстовых полей в WPF?

4b9b3361

Ответ 1

Из-за позднего отчета об ошибке мы обнаружили, что мы не можем использовать ApplicationBend Cut и Paste непосредственно в частично доверенных приложениях. Поэтому при выполнении этих команд в любом Commmand ваших элементов управления ничего не будет сделано при выполнении.

Итак, по сути, ответ Брэдса был почти там, он наверняка выглядел правильным образом, то есть без черного фона, но не устранил проблему.

Мы решили "удалить" меню на основе ответа Brads, например:

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

И используйте это пустое контекстное меню:

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

Ответ 2

Чтобы создать стиль ContextMenu для всех текстовых полей, я бы сделал следующее:

Сначала в разделе ресурсов добавьте ContextMenu, который вы планируете использовать в качестве стандартного ContextMenu в текстовом поле.
например.

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

Во-вторых, создайте стиль для ваших TextBoxes, который использует ресурс контекстного меню:

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

Наконец, используйте текстовое поле как обычно:

<TextBox />

Если вместо этого вы хотите применить это контекстное меню только к некоторым вашим текстовым полям, не создавайте стиль выше и добавьте следующее в разметку TextBox:

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

Надеюсь, это поможет!

Ответ 3

Bizarre. ContextMenu="{x:Null}" не выполняет трюк.

Это делает, однако:

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

Ответ 4

Попробуйте удалить атрибут x: Key из ресурса Style, оставив TargetType. Я знаю, у вас должен быть этот x: ключ для ресурса, но если у вас есть его вместе с вашим TargetType, то ключ преобладает.

Вот образец стиля, который я использую в проекте для обрезания всех всплывающих подсказок в одном из моих приложений (это в App.Resources - обратите внимание, без ключа)

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

Ответ 5

Не имеет значения, если вы не предоставляете ключ, он будет использовать ключ TargetType как точно так же, как мой пример использует:)

Взято из MSDN по стилю:

Настройка свойства TargetType на тип TextBlock без установка x:Key неявно устанавливает x:Key в {x:Type TextBlock}. Это также означает, что если вы → указали вышеприведенный стиль x:Key значение, отличное от {x:Type TextBlock}, стиль не будет применяться ко всем элементам TextBlock автоматически. Вместо, вам нужно явно применить стиль к элементам TextBlock.

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

Ответ 6

Это то, что я всегда использую:

      <TextBox x:Name="MyTextbox">
         <TextBox.ContextMenu>
         <ContextMenu Visibility="Hidden"/>
         </TextBox.ContextMenu>
      </TextBox>

А также можете использовать:

       MyTextbox.ContextMenu.Visibility = Visibility.Hidden;
       MyTextbox.ContextMenu.Visibility = Visibility.Visble;