如果选择了radmenuitem,如何应用颜色?

时间:2014-03-19 10:57:42

标签: wpf c#-4.0 telerik wpf-controls radmenu

代码:

<telerik:RadMenuItem Header="Home" x:Name="radMenuHome" />

如果选择了radmenuitem的颜色,如何应用?我希望所选菜单项为灰色。感谢。

2 个答案:

答案 0 :(得分:1)

我不知道RadMenuItem类,但我只能假设它扩展了MenuItem类。如果是这种情况,那么这个答案应该仍然有意义。 WPF MenuItem有我称之为bug的内容......这个简短的例子证明了这一点:

<Menu>
    <Menu.Resources>
        <Style TargetType="{x:Type MenuItem}">
            <Style.Triggers>
                <Trigger Property="MenuItem.IsHighlighted" Value="True">
                    <Setter Property="MenuItem.Foreground" Value="Red" />
                    <Setter Property="MenuItem.Background" Value="Black" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Menu.Resources>
    <MenuItem Header="One" />
    <MenuItem Header="Two">
        <MenuItem Header="Three" />
    </MenuItem>
</Menu>

正如您所看到的,MenuItem.Foreground在鼠标移到Red时正确地更改为MenuItem,但Background没有。这是因为定义了默认MenuItem Controltemplate的方式。您可以在MSDN上的Menu Styles and Templates页面中找到此默认模板。

因此,实现所需内容的正确方法是为ControlTemplate定义基于链接页面中默认值的新MenuItem。为了让您更加棘手,您实际上会在默认值中找到四个ControlTemplate ...这些是TopLevelHeaderTopLevelItemSubmenuHeaderSubmenuItem所以你可以用不同的方式设置顶级和子MenuItem的样式。

无论如何,查看这些ControlTemplate,您应该看到以下Trigger(来自链接页面):

<Trigger Property="IsHighlighted"
         Value="true">
  <Setter Property="Background"
          TargetName="Border">
    <Setter.Value>
      <LinearGradientBrush StartPoint="0,0"
                           EndPoint="0,1">
        <LinearGradientBrush.GradientStops>
          <GradientStopCollection>
            <GradientStop Color="{StaticResource ControlLightColor}" />
            <GradientStop Color="{StaticResource ControlMouseOverColor}"
                          Offset="1.0" />
          </GradientStopCollection>
        </LinearGradientBrush.GradientStops>
      </LinearGradientBrush>

    </Setter.Value>
  </Setter>
</Trigger>

在此处更改Setter.Value应该会产生您想要的效果,但您需要将其找到的所有ControlTemplate都这样做。我的最后一个提示是在定义新的ControlTemplate时,您应该从默认的XAML开始,然后只有在看到它正常工作并且控件看起来像默认情况下应该执行时才进行编辑和更改。此外,继续运行项目以查看它是否仍然适用于您所做的每一个更改。祝你好运。


更新&gt;&gt;&gt;

我刚刚找到了Jim Nuzzi博客的WPF XAML MenuItem Styles页面,其中进一步解释了为您自定义WPF MenuMenuItem课程。

答案 1 :(得分:0)

尝试此操作(仅适用于Web / .NET方案):

protected void RadMenu1_ItemDataBound(object sender, Telerik.Web.UI.RadMenuEventArgs e)
{
    if (e.Item.NavigateUrl == Request.Url.LocalPath)
    {
        e.Item.ForeColor = System.Drawing.Color.White;
        e.Item.BackColor = System.Drawing.Color.Gray;
    }
}

注意:添加ItemDataBound =&#34; RadMenu ItemDataBound n#34;到你的Telerik:RadMenu标签