【问题标题】:Customizing Context Menu in WPF在 WPF 中自定义上下文菜单
【发布时间】:2013-03-28 06:15:29
【问题描述】:

我在这里有一个项目,我需要在我的 WPF 应用程序中自定义上下文菜单,其中一个按钮将放置在所有菜单项的底部。

但是,如果我要通过 XAML 添加按钮,它将在上下文菜单中显示为集合中的另一个项目,并且鼠标悬停突出显示将作用于它。

我希望将上下文菜单调整为类似网格的样式,从而可以自定义其下方的样式。

知道如何实现这一点(最好在 XAML 中)?

【问题讨论】:

    标签: wpf xaml contextmenu


    【解决方案1】:

    在 XAML 中实际上非常简单。 只需在要为其设置上下文菜单的元素下定义它即可。

            <Border>
                <Border.ContextMenu>
                    <ContextMenu>
                        <ContextMenu.Template>
                            <ControlTemplate>
                                <Grid>
                                    <!--Put anything you want in here.-->
                                </Grid>
                            </ControlTemplate>
                        </ContextMenu.Template>
                    </ContextMenu>
                </Border.ContextMenu>
            </Border>
    

    【讨论】:

    • 太棒了! +1 正在寻找这个
    • 完美运行! :)
    【解决方案2】:

    对于带有按钮的菜单项样式,您可以使用以下代码:

    注意 - 将项目添加到 Header 将使其保持在相同的 MenuItem 中,但如果添加到 MenuItem 则只会将其视为新的 MenuItem。

    <ContextMenu>
        <ContextMenu.Items>
           <MenuItem>
              <MenuItem.Header>
                 <StackPanel>
                    <TextBlock Text="Item 1"/>
                    <Button Content="Button 1" Margin="5"/>
                 </StackPanel>
              </MenuItem.Header>
            </MenuItem>
            <MenuItem>
              <MenuItem.Header>
                 <StackPanel>
                    <TextBlock Text="Item 2"/>
                    <Button Content="Button 2" Margin="5"/>
                  </StackPanel>
               </MenuItem.Header>
              </MenuItem>
         </ContextMenu.Items>
     </ContextMenu>
    

    这将是生成的ContextMenu:

    从那里您可以设置MenuItem 或Button 等样式。

    希望对你有帮助!

    【讨论】:

      【解决方案3】:

      您可以从ContextMenu 的示例样式/模板(来自here)开始,然后根据您的需要进行调整。

      <Style TargetType="{x:Type ContextMenu}">
        <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 x:Name="Border"
                      Background="{StaticResource MenuPopupBrush}"
                      BorderThickness="1">
                <Border.BorderBrush>
                  <SolidColorBrush Color="{StaticResource BorderMediumColor}" />
                </Border.BorderBrush>
                <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>
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 2012-04-22
      相关资源
      最近更新 更多