【发布时间】:2014-08-30 14:06:15
【问题描述】:
我希望使用 ASP.NET 菜单控件来导航我的网站。但是,我要求每个 MenuItem 的样式必须不同(不同的颜色,静态和 onHover)。如果不创建从 MenuItem 继承的自定义类,这可能吗?
想到更好的解决方案?
【问题讨论】:
标签: asp.net menu styles menuitem
我希望使用 ASP.NET 菜单控件来导航我的网站。但是,我要求每个 MenuItem 的样式必须不同(不同的颜色,静态和 onHover)。如果不创建从 MenuItem 继承的自定义类,这可能吗?
想到更好的解决方案?
【问题讨论】:
标签: asp.net menu styles menuitem
如果其他人遇到同样的问题...
对我有用的一种快速而肮脏的方法是强制将 HTML 内容放入 MenuItem Text(适当的转义)。然后,您可以在 CSS 中以任何您想要的方式对其进行样式设置,甚至可以将每个菜单项设置为使用不同的样式:
<asp:MenuItem Text="<span class="menuitem_text">Text Here</span>" />
HTML 以 <a> 标记结束:
<li><a ...><span class="menuitem_text">Text Here</span></a></li>
【讨论】:
没有覆盖菜单上的 RenderContents,您的选择非常有限。您需要的大部分内容都是私密且密封的,您将无处可去。
我的解决方案是使用模板。您可以使用 MenuItem.Value 或 Depth 和 ItemIndex 来识别每个项目并提供必要的属性。
在页面中:
<asp:Menu ID="menu" runat="server" DynamicHorizontalOffset="2" StaticSubMenuIndent="10px">
<Items>
<asp:MenuItem Text="Item 1" Value="value 1">
<asp:MenuItem Text="Item 2" Value="value 2">
<asp:MenuItem Text="Item 3" Value="value 3"></asp:MenuItem>
</asp:MenuItem>
<asp:MenuItem Text="Item 4" Value="value 4">
<asp:MenuItem Text="Item 5" Value="value 5"></asp:MenuItem>
</asp:MenuItem>
<asp:MenuItem Text="Item 6" Value="value 6"></asp:MenuItem>
</asp:MenuItem>
<asp:MenuItem Text="Item 7" Value="value 7"></asp:MenuItem>
<asp:MenuItem Text="Item 8" Value="value 8"></asp:MenuItem>
</Items>
<StaticItemTemplate>
<asp:Panel runat="server" ForeColor='<%# GetItemColor(Container) %>'>
<%# Eval("Text") %> - <%# Eval("Value") %>
</asp:Panel>
</StaticItemTemplate>
<DynamicItemTemplate>
<asp:Panel ID="Panel1" runat="server" ForeColor='<%# GetItemColor(Container) %>'>
<%# Eval("Text") %> - <%# Eval("Value") %>
</asp:Panel>
</DynamicItemTemplate>
</asp:Menu>
在代码中(不要介意这段代码的愚蠢,只是为了演示原理):
public Color GetItemColor(MenuItemTemplateContainer container)
{
MenuItem item = (MenuItem)container.DataItem;
//identify based value
if (item.Value == "value 2")
return Color.Brown;
//identify based on depth and index
if (item.Depth == 0)
switch (container.ItemIndex)
{
case 0: return Color.Red;
case 1: return Color.Blue;
case 2: return Color.DarkGreen;
default:
return Color.Black;
}
else
switch (container.ItemIndex)
{
case 0: return Color.Purple;
case 1: return Color.Aqua;
case 2: return Color.DarkOrange;
default:
return Color.Black;
}
}
【讨论】:
尝试这样设置每个菜单项的样式:
后面的代码:
mnuMail.Items[1].Text = "<span class=\"bold\">Inbox</span>";
CSS 类:
.bold
{
font-weight: bold;
}
【讨论】:
如果以编程方式生成菜单,则可以在创建每个 MenuItem 时添加样式和 onmouseover/onmouseout 属性,例如:
menuItem.Attributes["style"] = "color: red;";
menuItem.Attributes["onmouseover"] = "javascript:Highlight(this);";
或者,尝试在标记中添加这些属性,IntelliSense 不会告诉您它们有效,但它们通常会有效(我没有专门使用 MenuItems 对其进行测试):
<asp:menuitem navigateurl="Home.aspx"
text="Home"
imageurl="Images\Home.gif"
popoutimageurl="Images\Popout.jpg"
tooltip="Home"
style="color: red;" onmouseover="Highlight(this);" onmouseout="Unhighlight(this);"/>
CSS Friendly Adapters 可能会给你带来一些运气。
当然,您可以创建一个继承类并重新处理渲染例程...
【讨论】: