2009-04-01 36 views
11

私は、ASP.NETメニューコントロールを使用して自分のサイトをナビゲートしたいと考えています。しかし、私は、それぞれのMenuItemを異なるスタイルにする必要があるという要件を持っています(異なる色、static、onHoverの両方)。 MenuItemから継承するカスタムクラスを作成しないと、これは可能ですか?ASP.NET MenuItem個別のスタイル

もっと良い解決策を考えていますか?

答えて

10

メニュー上の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; 
     } 
} 
+0

これは私が撮影しているものに対して完全に機能しています。 – CodeMonkey1313

+0

これは彼の "ホバー"色の要求をどのように解決するのか分かりません。あなたが示したように、パネルコントロールにはForeColorプロパティがありますが、onmouseoverのようなものはありません。デフォルトのメニュー項目の色に興味がある場合は、 Buggieboy

+0

@Buggieboyはおそらくこの理論をに適用しています... – clamchoda

-3

あなたは、プログラムメニューを生成する場合は、あなたのスタイルを追加することができますし、onmouseover属性/れるonmouseoutそれぞれのMenuItemを作成するときに属性、例えば:また

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

、マークアップでそれらの属性を追加してみてください、IntelliSenseが教えてくれません(私はのMenuItemと特異的にそれをテストしていない)、あなたは彼らが働くことを、彼らは通常の操作を行います。

<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でいくつかの運を持っているかもしれません。

あなたが継承されたクラスと再作業のレンダリングルーチンを作成することができます。もちろん、

...

+1

マークアップに追加するには動作しません、それはパーサエラー – CodeMonkey1313

+1

に結果とのMenuItemは、属性メンバを持っていません。 – CodeMonkey1313

+0

そして、menuitemのmouseoverプロパティはありません。 – Buggieboy

11

誰にも同じ質問にバンプ場合..

私にとっては、適切なエスケープを使用してMenuItem TextにHTMLコンテンツを強制的に挿入するのが速く汚れた方法でした。あなたは、あなたがあなたのCSSで好きなようにそれをスタイル、あるいは別のスタイルを使用するように各メニュー項目を設定することができます。

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

HTMLが<a>タグ内に終わる:

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

これは間違いなく機能しますが、あまりにも汚いかどうかわかりません。 – ken2k

+5

非常に汚い..私はそれが好きです。正直言って、あなたがWebフォームであまりにも汚いことはできないと思っています。 –

0

は次のように試してみてください各メニュー項目のスタイルを設定するには、この:背後

コード:

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

CSSクラス:

.bold 
{ 
    font-weight: bold; 
} 
関連する問題