2014-05-25 105 views
0

我有一個按鈕,這個按鈕有一個上下文菜單。當左擊按鈕時,我使用按鈕點擊觸發器將ContextMenu.IsOpen屬性設置爲true。 我的問題是如下 - 只要我做的按鈕不點擊右鍵,在右鍵菜單不繼承我在窗口的資源定義的樣式。 我搜索了它,發現上下文菜單的樣式只有在右鍵單擊後才初始化。 即使我不右鍵單擊它,我如何強制樣式初始化? (我無法將上下文菜單的樣式設置爲硬編碼,因爲我希望在更改主題時自動輕鬆地更改上下文菜單的樣式,而不需要單獨維護每個上下文菜單(對於我的代碼)。 謝謝!的ContextMenu不繼承資源風格

的XAML:

`

<Window.Resources> 
    <Style TargetType="ContextMenu"> 
     <Setter Property="Background" Value="Green"/> 
    </Style> 
</Window.Resources> 

<Grid> 
    <Button Content="Click Me!" Width="80" Height="50"> 
     <Button.Style> 
      <Style TargetType="Button"> 
       <Style.Triggers> 
        <EventTrigger RoutedEvent="Click"> 
         <EventTrigger.Actions> 
          <BeginStoryboard> 
           <Storyboard> 
            <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen"> 
             <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/> 
            </BooleanAnimationUsingKeyFrames> 
           </Storyboard> 
          </BeginStoryboard> 
         </EventTrigger.Actions> 
        </EventTrigger> 
       </Style.Triggers> 
      </Style> 
     </Button.Style> 
     <Button.ContextMenu> 
      <ContextMenu> 
       <MenuItem> 
        <MenuItem.Header> 
         <CheckBox Content="Include First Option"/> 
          </MenuItem.Header> 
       </MenuItem> 
       <MenuItem> 
        <MenuItem.Header> 
         <CheckBox Content="Include Second Option"/> 
        </MenuItem.Header> 
       </MenuItem> 
      </ContextMenu> 
     </Button.ContextMenu> 
    </Button> 
</Grid> 

'

回答

0

創建自己的完整的風格(這這裏只是一個簡單的示例),並配有專用鑰匙使用。

<Style x:Key="CustomContextMenu" 
     TargetType="{x:Type ContextMenu}"> 
    <Setter Property="Background" 
      Value="Green" /> 
    <Setter Property="BorderBrush" 
      Value="#888888" /> 
    <Setter Property="BorderThickness" 
      Value="1" /> 
    <Setter Property="SnapsToDevicePixels" 
      Value="True" /> 
    <Setter Property="OverridesDefaultStyle" 
      Value="True" /> 
    <Setter Property="Grid.IsSharedSizeScope" 
      Value="true" /> 
    <Setter Property="HasDropShadow" 
      Value="True" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ContextMenu}"> 
       <Border Name="Border" 
         Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 
        <StackPanel IsItemsHost="True" 
           KeyboardNavigation.DirectionalNavigation="Cycle" /> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="HasDropShadow" 
           Value="true"> 
         <Setter TargetName="Border" 
           Property="Padding" 
           Value="0,3,0,3" /> 
         <Setter TargetName="Border" 
           Property="CornerRadius" 
           Value="4" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

使用

<Button.ContextMenu> 
    <ContextMenu Style="{StaticResource CustomContextMenu}"> 
     <MenuItem> 
      <MenuItem.Header> 
       <CheckBox Content="Include First Option" /> 
      </MenuItem.Header> 
     </MenuItem> 
     <MenuItem> 
      <MenuItem.Header> 
       <CheckBox Content="Include Second Option" /> 
      </MenuItem.Header> 
     </MenuItem> 
    </ContextMenu> 
</Button.ContextMenu> 

希望幫助!

enter image description here

+0

它並沒有真正解決我的問題 - 如果我你有什麼建議,這意味着每次我更改主題時,我需要改變所有的上下文菜單的風格我手頭上有我的代碼,這不是很方便維護(我更喜歡使用沒有鍵的樣式,所以它只會繼承樣式,就像任何普通的控件一樣)。有什麼建議麼?不管怎麼說,還是要謝謝你 :) – user3673905

1

找到我一直在尋找的答案 - 文本菜單是一個特殊的控制 - 它並不把它定義在窗口的一部分,而是一個分開的窗口。右擊它後,它會檢查是誰調用它並初始化可繼承的屬性。但是,以不同的方式打開它 - 它不知道是誰打開它的。 答案 - 爲了使上下文菜單的默認樣式要覆蓋,風格已在App.xaml中被定義沒有鑰匙。

的App.xaml中的資源應該是這樣的:

<Application.Resources> 
     <Style TargetType="ContextMenu"> 
      <Setter Property="Background" Value="Green"/> 
     </Style> 
    </Application.Resources>