0

メニュー項目の画像をアンカー内の <img> タグとしてレンダリングする代わりに、画像を背景画像として追加するクラスをアンカー タグに追加したいと考えています。

現時点では、画像の URL を検索する JavaScript で後処理を行っています。見つかった場合、それらは削除され、CSS クラスに置き換えられます。

メニューをオーバーライドするか、MenuAdapter を実装することでこれを実行する方法はありますか?
MenuAdapter クラスを見てきましたが、この小さな部分を変更するためだけに、すべてのレンダリング機能を再実装する必要があるようです。

[注: これを行う理由は、テキストの後に画像を表示したいからです。デフォルトのレンダリングを使用してこれを行うのに苦労しました。]

ETA:以下に回答します。

4

1 に答える 1

3

I found the simplest way is to override the Render method of the Menu.

Using this menu, you can put a tooltip and css class, separated by a semi-colon, in the ToolTip property of the menu item:
item.ToolTip = "this is the tip; class1 class2";

Note: This is a simplistic menu that performs as much as I want it to do. It ignores ImageUrl and SeparatorImageUrl.

public class CSSItemMenu : Menu
    {

        protected override void Render(HtmlTextWriter writer)
        {
            this.PerformDataBinding();

            writer.Write(string.Format("<div id=\"{0}\" class=\"{1}\">", base.ClientID, base.CssClass));
            writer.WriteLine();
            writer.WriteLine("<ul class=\"level1\">");

            foreach (MenuItem item in Items)
            {
                WriteItem(writer, item, 1);
            }

            writer.WriteLine("</ul>");
            writer.WriteLine("</div>");
        }

        private static void WriteItem(HtmlTextWriter writer, MenuItem item, int level)
        {
            writer.WriteLine("<li>");

            string title = "";
            var userClass = "";
            if (!string.IsNullOrEmpty(item.ToolTip))
            {
                var data = item.ToolTip.Split(';');
                title = string.Format(" title=\"{0}\"", data[0].Trim());
                if (data.Length > 1)
                {
                    userClass = " " + data[1].Trim();
                }
            }
            var cssClass = string.Format("class = \"popout level{0}{1}\"", level, userClass);

            writer.WriteLine(string.Format("<a {0} href=\"{1}\"{2}>{3}</a>", cssClass, item.NavigateUrl, title, item.Text));

            if (item.ChildItems.Count > 0)
            {
                writer.WriteLine(string.Format("<ul class=\"level{0}\">", level + 1));
                foreach (MenuItem child in item.ChildItems)
                {
                    WriteItem(writer, child, level + 1);
                }
                writer.WriteLine("</ul>");
            }

            writer.WriteLine("</li>");
        }

    }
于 2012-11-08T08:13:48.003 に答える