2015-08-24 6 views
1

Я пытаюсь создать ресурс стиля для контекстного меню, которое я динамически присваиваю расширителям. Я хочу установить прослушиватель событий щелчка для пунктов меню в контекстном меню в стиле, но я получаю ошибки, из которых я не могу найти решение.WPF Style EventSetter error error

Ошибка:

  • событие 'Click' не может быть указана на целевой тег в стиле. Вместо этого используйте EventSetter.
  • Недопустимое значение свойства 'Handler': 'Microsoft.VisualStudio.DesignTools.Xaml.LanguageService.Semantics.XmlValue'

    <Style x:Key="LincrosContextMenu" 
         TargetType="{x:Type ContextMenu}" 
         BasedOn="{StaticResource MetroContextMenu}"> 
        <Style.Resources> 
         <Style TargetType="{x:Type MenuItem}"> 
          <Setter Property="FontSize" Value="12" /> 
          <Setter Property="Padding" Value="0, 3, 0, 3" /> 
          <EventSetter Event="Click" Handler="ContextMenu_MenuItem_Click"/> 
         </Style> 
         <Style TargetType="{x:Type Separator}"> 
          <Setter Property="Margin" Value="6, 0, 0, 0" /> 
         </Style> 
        </Style.Resources> 
    </Style> 
    
    <ContextMenu x:Key="ProjectFolderContext" Style="{StaticResource ResourceKey=LincrosContextMenu}"> 
        <MenuItem Header="Add"/> 
        <Separator/> 
        <MenuItem Header="Cut" /> 
        <MenuItem Header="Copy" /> 
        <MenuItem Header="Paste" /> 
        <MenuItem Header="Rename" /> 
        <Separator/> 
        <MenuItem Header="Open Folder in File Browser" /> 
        <Separator/> 
        <MenuItem Header="Properties" /> 
    </ContextMenu> 
    

Я попробовал это решение, но, к сожалению, это не повлияло на меня.

Ссылка: WPF ListView SelectionChanged inside style does not work. EventSetter either

ответ

1

Причина, почему это не работает, потому что вы не можете иметь style, который использует EventSetter инлайн (т.е. внутри стиля управления, или в вашем случае, в другом стиле). Вы можете исправить это, поставив MenuItem в свой собственный Resource.

Смотрите ниже:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <Style TargetType="{x:Type MenuItem}"> 
      <Setter Property="FontSize" Value="12" /> 
      <Setter Property="Padding" Value="0, 3, 0, 3" /> 
      <EventSetter Event="Click" Handler="ContextMenu_MenuItem_Click"/> 
     </Style> 

     <Style x:Key="LincrosContextMenu" TargetType="{x:Type ContextMenu}"> 
      <Style.Resources> 
       <Style TargetType="{x:Type Separator}"> 
        <Setter Property="Margin" Value="6, 0, 0, 0" /> 
       </Style> 
      </Style.Resources> 
     </Style> 

     <ContextMenu x:Key="ProjectFolderContext" Style="{StaticResource LincrosContextMenu}"> 
      <MenuItem Header="Add"/> 
      <Separator/> 
      <MenuItem Header="Cut" /> 
      <MenuItem Header="Copy" /> 
      <MenuItem Header="Paste" /> 
      <MenuItem Header="Rename" /> 
      <Separator/> 
      <MenuItem Header="Open Folder in File Browser" /> 
      <Separator/> 
      <MenuItem Header="Properties" /> 
     </ContextMenu> 
    </Window.Resources> 

    <Button Width="100" Height="75" ContextMenu="{StaticResource ProjectFolderContext}"/> 
</Window> 
+0

Кажется, ошибка исчезла после того, как я построил проект. Я предполагаю, что решение, на которое я ссылался, не работает, потому что я не пытался построить проект. Думаю, я не должен полностью доверять редактору визуальных студий. Спасибо за вашу помощь! :) –

0

Поскольку я не могу изменить свой собственный вопрос, это был мой конец решение на основе принятого ответа от «d.moncada».

<Style x:Key="LincrosContextMenuItem" TargetType="{x:Type MenuItem}"> 
     <Setter Property="FontSize" Value="12" /> 
     <Setter Property="Padding" Value="0, 3, 0, 3" /> 
     <EventSetter Event="Click" Handler="ContextMenu_MenuItem_Click"/> 
    </Style> 

    <Style x:Key="LincrosContextMenu" 
      TargetType="{x:Type ContextMenu}" 
      BasedOn="{StaticResource MetroContextMenu}"> 
     <Style.Resources> 
      <Style TargetType="{x:Type MenuItem}" BasedOn="{StaticResource LincrosContextMenuItem}" /> 
      <Style TargetType="{x:Type Separator}"> 
       <Setter Property="Margin" Value="6, 0, 0, 0" /> 
      </Style> 
     </Style.Resources> 
    </Style> 

Счастливое кодирование. :)