c# - 上下文菜单背景着色

标签 c# wpf user-interface

我在尝试使用 XAML 创建上下文菜单时遇到了一些问题。它应该相当简单,只是一个菜单项列表,偶尔带有分隔符。

我已经能够正确地安排它,所有的项目都在正确的位置,现在我正在继续设计它的样式和主题。我们通过公开许多在应用程序级别换出的命名画笔来设置主题,因此在上下文菜单、菜单项和分隔符控件的样式中,我将这些名称绑定(bind)为动态资源。到目前为止,所有这些都是沼泽标准。

我看到的问题是,对于我的分隔符,我在上下文菜单的左侧有一大块空间,它显示的背景与菜单的其余部分不同,这在视觉上非常分散注意力。你可以看到一个例子,想象一下它在我们较暗的主题上是如何变得更糟的!

Imgur

在我们的黑暗风格中:

Imgur

这是我用于上下文菜单和分隔符的样式:

<Style TargetType="{x:Type ContextMenu}">
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="{DynamicResource HighlightBrush}"/>
        </Trigger>
        <DataTrigger Binding="{Binding ContextMenu.IsOpen,RelativeSource={RelativeSource Mode=Self}}" Value="True">
            <Setter Property="Background" Value="{DynamicResource HighlightBrush}"/>
        </DataTrigger>
    </Style.Triggers>
    <Setter Property="Background" Value="{DynamicResource BackgroundLight}" />
    <Setter Property="Foreground" Value="{DynamicResource ForegroundText}" />
    <Setter Property="BorderThickness" Value="1" />
</Style>

<Style x:Key="{x:Static MenuItem.SeparatorStyleKey}" TargetType="{x:Type Separator}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Separator}">
                <Grid Margin="0,6,0,4" SnapsToDevicePixels="true">
                    <Rectangle Margin="30,0,1,1" Height="1" Fill="{DynamicResource BackgroundLight}"/>
                    <Rectangle Margin="30,1,1,0" Height="1" Fill="{DynamicResource ContextMenuSeparator}"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我不知道这个该死的东西是从哪里来的,当我窥探应用程序的可视化树时,我只看到一个带有白色 Canvas 的 ContentPresenter,我不知道如何删除它。有人见过这个吗?

最佳答案

好的先生,您应该可以通过MenuItem.SeparatorStyleKey Property获得您想要的行为。 .

默认样式似乎是这样的:

<Style x:Key="{x:Static MenuItem.SeparatorStyleKey}"
       TargetType="{x:Type Separator}">
    <Setter Property="MinHeight" Value="2"/>
    <Setter Property="Margin" Value="2,4,2,3"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Separator}">
                <theme:ClassicBorderDecorator BorderStyle="HorizontalLine"
                                              BorderBrush="{x:Static theme:ClassicBorderDecorator.ClassicBorderBrush}"
                                              BorderThickness="1"/>

            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

您可以通过 ClassicBorderBrush 的 Background 属性进行黑客攻击。 (模板绑定(bind)?)

关于c# - 上下文菜单背景着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8245010/

相关文章:

c# - 未找到 ObjectDataProvider wpf 本地类型

java - 关闭窗口 - 但不要停止程序 - JAVA

Java Swing - 单击按钮后完成计算时 GUI 卡住

c# - 从 WebBrowser 控件 C# 获取滚动值

c# - RhinoMock 3.6.1 报错方法未调用?

c# - Assembly.Load 和 Assembly.LoadFrom 的区别?

javascript - toString().length 在一个有零且只有零的数字上总是返回 0

c# - 有没有办法预测 `Marshal.GetExceptionForHR(code, pointers)` 会抛出 `AccessViolationException`

c# - 从 Iron Python 脚本(从 C# 脚本引擎调用)调用 Python 脚本时出现问题

c# - 在 WPF 中高效地显示和缩放/平移大图像