【问题标题】:ASP.NET MenuItem Individual StylesASP.NET MenuItem 个别样式
【发布时间】:2014-08-30 14:06:15
【问题描述】:

我希望使用 ASP.NET 菜单控件来导航我的网站。但是,我要求每个 MenuItem 的样式必须不同(不同的颜色,静态和 onHover)。如果不创建从 MenuItem 继承的自定义类,这可能吗?

想到更好的解决方案?

【问题讨论】:

    标签: asp.net menu styles menuitem


    【解决方案1】:

    如果其他人遇到同样的问题...

    对我有用的一种快速而肮脏的方法是强制将 HTML 内容放入 MenuItem Text(适当的转义)。然后,您可以在 CSS 中以任何您想要的方式对其进行样式设置,甚至可以将每个菜单项设置为使用不同的样式:

    <asp:MenuItem Text="<span class=&quot;menuitem_text&quot;>Text Here</span>" />
    

    HTML 以 &lt;a&gt; 标记结束:

    <li><a  ...><span class="menuitem_text">Text Here</span></a></li>
    

    【讨论】:

    • 这绝对有效,但我不确定它是否太脏了?
    • 很脏.. 我喜欢。老实说,我认为 Web 表单不能太脏,一开始就很混乱。
    【解决方案2】:

    没有覆盖菜单上的 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;
            }
    }
    

    【讨论】:

    • 我不明白这如何解决他的“悬停”颜色要求。虽然面板控件确实具有 ForeColor 属性,但正如您所展示的,它没有类似 onmouseover 的任何东西。如果您只对默认菜单项颜色感兴趣,可以执行以下操作:
    【解决方案3】:

    尝试这样设置每个菜单项的样式:

    后面的代码:

     mnuMail.Items[1].Text = "<span class=\"bold\">Inbox</span>";  
    

    CSS 类:

    .bold
    {
       font-weight: bold;
    }
    

    【讨论】:

      【解决方案4】:

      如果以编程方式生成菜单,则可以在创建每个 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 可能会给你带来一些运气。

      当然,您可以创建一个继承类并重新处理渲染例程...

      【讨论】:

      • 将其添加到标记中不起作用,会导致解析器错误
      • 而且 MenuItem 没有 Attributes 成员。
      • 而且 menuitem 没有 mouseover 属性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 2018-09-01
      • 2015-04-12
      相关资源
      最近更新 更多