ASP.NET MenuItem Individual Styles

后端 未结 4 1892
無奈伤痛
無奈伤痛 2020-12-10 13:37

I\'m hoping to use an ASP.NET Menu Control for navigation through my site. However, I\'ve got a requirement that each MenuItem must be styled differently (different colors,

相关标签:
4条回答
  • 2020-12-10 13:49

    If anyone else bumps into the same question...

    A quick and dirty method that worked for me is to force HTML contents into the MenuItem Text (with appropriate escaping). You can then style it any way you want in your CSS, or even set each menu item to use a different style:

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

    The HTML ends up inside the <a> tag:

    <li><a  ...><span class="menuitem_text">Text Here</span></a></li>
    
    0 讨论(0)
  • 2020-12-10 13:52

    If you generate the menu programmatically, you can add the style and onmouseover/onmouseout attributes when creating each MenuItem, e.g.:

    menuItem.Attributes["style"] = "color: red;";
    menuItem.Attributes["onmouseover"] = "javascript:Highlight(this);";
    

    Alternatively, try adding those attributes in the markup, IntelliSense won't tell you that they work, but they usually do (I haven't tested it specifically with 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);"/>
    

    You might have some luck with CSS Friendly Adapters.

    Of course you can create an inherited class and re-work the rendering routines...

    0 讨论(0)
  • 2020-12-10 13:57

    Try like this to set style for each menu item:

    Code behind:

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

    CSS class:

    .bold
    {
       font-weight: bold;
    }
    
    0 讨论(0)
  • 2020-12-10 14:03

    Short of overriding RenderContents on Menu, your options are very limited. Most of what you'd need is private and sealed and you won't get anywhere there.

    My solution would be to use templates. You could use MenuItem.Value or Depth and and ItemIndex to identify each item and provide necessary attributes.

    In Page:

    <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>
    

    In Code (never mind silliness of this code, it is just to demonstrate the principle):

    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;
            }
    }
    
    0 讨论(0)
提交回复
热议问题