2009-03-13 11 views
9

Я пытаюсь изменить стиль по умолчанию для ContextMenu в WPF.По умолчанию ContextMenu Style - WPF

Обычно вы можете создать копию значения по умолчанию в Expression Blend с помощью параметра «Редактировать элементы управления» («Шаблон»)> «Редактировать параметры копирования». Однако я не могу понять, как это сделать с помощью ContextMenu. Любая идея, как я могу изменить стиль по умолчанию?

Я пытаюсь отключить левую часть контекстного меню, где обычно отображаются значки.

Спасибо!

Обновление: Возможно, я не был прав об удалении значков. Например, если у вас есть контекстное меню без значков, то вся левая часть меню будет потрачена впустую. Я хотел бы изменить стиль по умолчанию фона контекстного меню, чтобы удалить его. Просто я не знаю, как получить доступ к этому стилю по умолчанию.

+0

Люк, вы решили эту проблему? Я немного смущен всеми этими разными идеями ниже. Спасибо за любой намек! –

+0

Да, я использовал ответ ниже, чтобы получить шаблон и изменить его оттуда. – Luke

ответ

10

Для шаблонов и стилей, которые не доступны через Expression интерфейс (например, шаблон ContextMenu), вы можете использовать следующий код для извлечения шаблона:

Dim sb As System.Text.StringBuilder = New System.Text.StringBuilder 
Using Writer As TextWriter = New StringWriter(sb) 
    System.Windows.Markup.XamlWriter.Save(ContextMenu.Template, Writer) 
End Using 
Debug.Write(sb.ToString) 

Или в C#

var str = new StringBuilder(); 
using (var writer = new StringWriter(str)) 
    XamlWriter.Save(ContextMenu.Template, writer); 
Debug.Write(str); 
+4

Обратите внимание, что для получения шаблона в ContextMenu вам необходимо хотя бы добавить один элемент MenuItem в свою коллекцию Items. В противном случае значение ContextMenu.Template равно null. –

+0

Я люблю переполнение стека. Большое спасибо за эти ответы, именно то, что мне тоже нужно. – scobi

2

Фактически пространство не является частью ContextMenu, оно является частью MenuItem. Так что просто перетащите MenuItem в свое окно в виде blend и создайте копию элемента управления. Надеюсь, что ваше заявление ContextMenu заключается в следующем

<ContextMenu > 
    <MenuItem Header="Copy"/> 
    <MenuItem Header="Paste"/> 
    <MenuItem Header="Clear"/> 
</ContextMenu> 

И внутри MenuItem ControlTemplate вы можете видеть пространство, как показано ниже. Поэтому удалите значок и первый столбец сетки, отмеченные на снимке экрана.

alt text

+0

Хорошо, что мне нравится стиль по умолчанию для MenuItem, но он не дает мне стиль ContextMenu. Expression Blend не позволит мне добавить ContextMenu в окно. – Luke

+0

Он показывает ошибку: «ContextMenu не может иметь логического или визуального родителя», если я добавлю ContextMenu в окно. – Luke

+0

Да, есть также стили внутри ContextMenu для меню левой стороны, которое необходимо удалить. Это стили ContextMenu, с которыми я не могу получить доступ, используя интерфейс Expression. Я опубликовал решение ниже, чтобы извлечь шаблон с помощью кода. – Luke

0

Дополнительное пространство слева объясняется небольшим флажком, который появляется, когда вы устанавливаете IsCheckable и IsChecked в true на MenuItem.

Флажок находится в шаблоне для MenuItem, поэтому, если вы отредактируете его, вы можете его вынуть.

+0

Свойство 'IsCheckable' влияет на взаимодействие пользователя с пунктом меню, а не показывает ли область проверки/значка в меню. Фактически, значение по умолчанию уже «False». Установка его в «True» просто приводит к тому, что галочка автоматически переключается каждый раз, когда пользователь выбирает этот пункт меню. –

7

Я нашел простой способ получить шаблон ContextMenu в смеси:

  1. я добавил ContextMenu к переключату n с некоторыми элементами меню.
  2. В разделе «Разное» в области свойств есть элемент сгруппирован для ContextMenu.
  3. Открыть это. Вы найдете обычные свойства стиля и шаблона.
  4. Нажмите на квадрат для всплывающего меню, и выберите Преобразовать в новый ресурс ...

Вот и все. Выберите, где вы хотите, чтобы шаблон/стиль был помещен, и все готово.

Вот разметка у меня был:

<StackPanel x:Name="LayoutRoot"> 
    <Button Content="Click for ContextMenu" Width="30" HorizontalAlignment="Center" VerticalAlignment="Center"> 
     <Button.ContextMenu> 
      <ContextMenu Template="{DynamicResource ContextMenuControlTemplate1}" Style="{DynamicResource ContextMenuStyle1}"> 
       <MenuItem Header="File"/> 
       <MenuItem Header="Edit"/> 
       <MenuItem Header="View"/> 
       <MenuItem Header="Recent Files"/> 
        <MenuItem Header="file1.txt"/> 
        <MenuItem Header="file2.txt"/> 
      </ContextMenu> 
     </Button.ContextMenu> 
    </Button> 
</StackPanel> 

И стиль/шаблон я получил:

<Style x:Key="ContextMenuStyle1" TargetType="{x:Type ContextMenu}"> 
    <Setter Property="Background" Value="{DynamicResource MenuBackgroundBrush}"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="BorderBrush" Value="{DynamicResource WindowBorderBrush}"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ContextMenu}"> 
       <Border Uid="Border_93"> 
        <Border.Style> 
         <Style TargetType="{x:Type Border}"> 
          <Setter Property="Tag" Value="{DynamicResource {x:Static SystemParameters.DropShadowKey}}"/> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="True"> 
            <Setter Property="Background" Value="Transparent"/> 
            <Setter Property="Padding" Value="0,0,5,5"/> 
            <Setter Property="Effect"> 
             <Setter.Value> 
              <DropShadowEffect BlurRadius="4" Opacity="0.8" ShadowDepth="1"/> 
             </Setter.Value> 
            </Setter> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </Border.Style> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Надеется, что это помогает. При обычной MS тщательности кисти в стиле по умолчанию не найдены. :)

+0

Ха-ха !: * Я нашел простой способ получить шаблон ContextMenu в Blend * - это наверняка выглядит как самый простой способ! – bgmCoder

+3

Кажется, это не полный XAML. Где определение «ContextMenuControlTemplate1»? –

2

Попробуйте следующее: (Поместите этот код в свою часть ресурсов вашего XAML) Это должно удалить полосу значков из контекстного меню.

<Style TargetType="{x:Type ContextMenu}"> 
    <Setter Property="OverridesDefaultStyle" Value="True" /> 
    <Setter Property="SnapsToDevicePixels" Value="True" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ContextMenu}"> 
       <Border BorderThickness="1" CornerRadius="4" BorderBrush="Black" x:Name="Border" Background="White"> 
        <StackPanel ClipToBounds="True" Orientation="Vertical" IsItemsHost="True" /> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="true"> 
         <Setter TargetName="Border" Property="Background" Value="White" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
Смежные вопросы