默认ContextMenu样式 - WPF

时间:2009-03-13 06:13:35

标签: .net wpf contextmenu

我正在尝试修改WPF中ContextMenu的默认样式。

通常,您可以使用编辑控件(模板)>在Expression Blend中创建默认值的副本。编辑“复制”菜单选项。但是我无法解决如何使用ContextMenu执行此操作。知道我怎么能修改默认样式吗?

我正在尝试禁用通常显示图标的上下文菜单的左侧。

谢谢!

更新:也许我不清楚删除图标。例如,如果您有一个没有图标的上下文菜单,那么菜单的整个左侧就是浪费的空间。我想修改上下文菜单背景的默认样式以删除它。我只是不知道如何访问这种默认样式。

5 个答案:

答案 0 :(得分:11)

对于无法通过Expression Interface访问的模板和样式(例如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);

答案 1 :(得分:9)

我找到了在Blend中获取ContextMenu模板的简单方法:

  1. 我在一个带有一些菜单项的按钮上添加了一个ContextMenu。
  2. 在属性窗格中的“杂项”下,有一个ContextMenu的分组项目。
  3. 打开这个。您将找到常用的样式和模板属性。
  4. 单击弹出菜单的方框,然后选择转换为新资源...
  5. 就是这样。选择你想要放置模板/样式的位置,然后就完成了。

    这是我的标记:

    <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彻底性中,找不到默认样式的画笔。 :)

答案 2 :(得分:3)

试试这个:(将此代码放在XAML的Resources部分中)这应该从上下文菜单中删除图标条。

svg

答案 3 :(得分:2)

实际上,该空间不是ContextMenu的一部分,它是MenuItem的一部分。因此,只需将MenuItem拖动到表达式混合中的窗口,然后创建控件的副本。希望您的ContextMenu声明如下

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

在MenuItem ControlTemplate中,您可以看到空格如下。因此,请删除我在屏幕截图中标记的网格的图标和第一列。

alt text

答案 4 :(得分:0)

左侧的额外空间是由于在IsCheckable上将IsCheckedtrue设置为MenuItem时显示的小复选标记。

复选标记位于MenuItem的模板中,因此如果您进行编辑,则可以将其删除。