NavigateBar.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using Bridge.Html5;
  2. using FrontendRouting;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. namespace LearnBridgeNet.Components
  7. {
  8. public class NavigateBar : IDisposable
  9. {
  10. private static readonly string AttrReplace = typeof(NavigateBar).FullName + "_action_replace";
  11. private readonly Dictionary<string, HTMLAnchorElement> _subElements = new Dictionary<string, HTMLAnchorElement>();
  12. private Dictionary<string, NavigateBarItem> _items;
  13. public HTMLElement Element { get; }
  14. public bool Hidden { get => Element.Hidden; set => Element.Hidden = value; }
  15. public NavigateBar(Node parent)
  16. {
  17. Element = new HTMLDivElement
  18. {
  19. ClassName = "navbar"
  20. };
  21. parent.AppendChild(Element);
  22. FeRoutingManager.Navigated += FeRouting_Navigated;
  23. }
  24. private void FeRouting_Navigated(object sender, EventArgs e)
  25. {
  26. foreach (var element in _subElements.Values)
  27. {
  28. element.Style.FontWeight = element.GetAttribute("href") == Window.Location.PathName
  29. ? "bold"
  30. : "";
  31. }
  32. }
  33. private static HTMLAnchorElement Create(string href, NavigateBarItem item)
  34. {
  35. var element = new HTMLAnchorElement { TextContent = item.Name, Href = href };
  36. element.SetAttribute(AttrReplace, item.Replace.ToString());
  37. element.AddEventListener(EventType.Click, evt =>
  38. {
  39. evt.PreventDefault();
  40. FeRoutingManager.Go(href,element.GetAttribute(AttrReplace)=="True");
  41. });
  42. return element;
  43. }
  44. public Dictionary<string, NavigateBarItem> Items
  45. {
  46. get => _items.ToDictionary(p => p.Key, p => p.Value);
  47. set
  48. {
  49. if (null == Items)
  50. {
  51. foreach (var element in _subElements.Values)
  52. {
  53. element.Remove();
  54. }
  55. _subElements.Clear();
  56. return;
  57. }
  58. _items = value.ToDictionary(p => p.Key, p => p.Value);
  59. foreach (var item in _items)
  60. {
  61. if (_subElements.TryGetValue(item.Key, out var element))
  62. {
  63. element.TextContent = item.Value.Name;
  64. element.SetAttribute(AttrReplace, item.Value.Replace.ToString());
  65. }
  66. else Element.AppendChild(_subElements[item.Key] = Create(item.Key, item.Value));
  67. }
  68. foreach (var key in _subElements.Keys.Where(p => false == _items.ContainsKey(p)).ToArray())
  69. {
  70. _subElements[key].Remove();
  71. _subElements.Remove(key);
  72. }
  73. FeRouting_Navigated(null, null);
  74. }
  75. }
  76. public void Dispose()
  77. {
  78. FeRoutingManager.Navigated -= FeRouting_Navigated;
  79. Element.Remove();
  80. }
  81. }
  82. }