MenuItemEx.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*************************************************************************************
  2. Extended WPF Toolkit
  3. Copyright (C) 2007-2013 Xceed Software Inc.
  4. This program is provided to you under the terms of the Microsoft Public
  5. License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license
  6. For more features, controls, and fast professional support,
  7. pick up the Plus Edition at http://xceed.com/wpf_toolkit
  8. Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids
  9. ***********************************************************************************/
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Windows.Controls;
  15. using System.Windows;
  16. namespace Xceed.Wpf.AvalonDock.Controls
  17. {
  18. public class MenuItemEx : MenuItem
  19. {
  20. static MenuItemEx()
  21. {
  22. IconProperty.OverrideMetadata(typeof(MenuItemEx), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnIconPropertyChanged)));
  23. }
  24. public MenuItemEx()
  25. {
  26. }
  27. #region IconTemplate
  28. /// <summary>
  29. /// IconTemplate Dependency Property
  30. /// </summary>
  31. public static readonly DependencyProperty IconTemplateProperty =
  32. DependencyProperty.Register("IconTemplate", typeof(DataTemplate), typeof(MenuItemEx),
  33. new FrameworkPropertyMetadata((DataTemplate)null,
  34. new PropertyChangedCallback(OnIconTemplateChanged)));
  35. /// <summary>
  36. /// Gets or sets the IconTemplate property. This dependency property
  37. /// indicates the data template for the icon.
  38. /// </summary>
  39. public DataTemplate IconTemplate
  40. {
  41. get { return (DataTemplate)GetValue(IconTemplateProperty); }
  42. set { SetValue(IconTemplateProperty, value); }
  43. }
  44. /// <summary>
  45. /// Handles changes to the IconTemplate property.
  46. /// </summary>
  47. private static void OnIconTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  48. {
  49. ((MenuItemEx)d).OnIconTemplateChanged(e);
  50. }
  51. /// <summary>
  52. /// Provides derived classes an opportunity to handle changes to the IconTemplate property.
  53. /// </summary>
  54. protected virtual void OnIconTemplateChanged(DependencyPropertyChangedEventArgs e)
  55. {
  56. UpdateIcon();
  57. }
  58. #endregion
  59. #region IconTemplateSelector
  60. /// <summary>
  61. /// IconTemplateSelector Dependency Property
  62. /// </summary>
  63. public static readonly DependencyProperty IconTemplateSelectorProperty =
  64. DependencyProperty.Register("IconTemplateSelector", typeof(DataTemplateSelector), typeof(MenuItemEx),
  65. new FrameworkPropertyMetadata((DataTemplateSelector)null,
  66. new PropertyChangedCallback(OnIconTemplateSelectorChanged)));
  67. /// <summary>
  68. /// Gets or sets the IconTemplateSelector property. This dependency property
  69. /// indicates the DataTemplateSelector for the Icon.
  70. /// </summary>
  71. public DataTemplateSelector IconTemplateSelector
  72. {
  73. get { return (DataTemplateSelector)GetValue(IconTemplateSelectorProperty); }
  74. set { SetValue(IconTemplateSelectorProperty, value); }
  75. }
  76. /// <summary>
  77. /// Handles changes to the IconTemplateSelector property.
  78. /// </summary>
  79. private static void OnIconTemplateSelectorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  80. {
  81. ((MenuItemEx)d).OnIconTemplateSelectorChanged(e);
  82. }
  83. /// <summary>
  84. /// Provides derived classes an opportunity to handle changes to the IconTemplateSelector property.
  85. /// </summary>
  86. protected virtual void OnIconTemplateSelectorChanged(DependencyPropertyChangedEventArgs e)
  87. {
  88. UpdateIcon();
  89. }
  90. #endregion
  91. static void OnIconPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
  92. {
  93. if (e.NewValue != null)
  94. {
  95. ((MenuItemEx)sender).UpdateIcon();
  96. }
  97. }
  98. bool _reentrantFlag = false;
  99. void UpdateIcon()
  100. {
  101. if (_reentrantFlag)
  102. return;
  103. _reentrantFlag = true;
  104. if (IconTemplateSelector != null)
  105. {
  106. var dataTemplateToUse = IconTemplateSelector.SelectTemplate(Icon, this);
  107. if (dataTemplateToUse != null)
  108. Icon = dataTemplateToUse.LoadContent();
  109. }
  110. else if (IconTemplate != null)
  111. Icon = IconTemplate.LoadContent();
  112. _reentrantFlag = false;
  113. }
  114. }
  115. }