LocalName.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Markup;
  8. namespace FWindSoft.Wpf
  9. {
  10. public class LocalName : DependencyObject
  11. {
  12. //子元素继承属性
  13. public static readonly DependencyProperty BaseNameProperty =
  14. DependencyProperty.RegisterAttached("BaseName", typeof(string),
  15. typeof(LocalName),
  16. new FrameworkPropertyMetadata(null,
  17. FrameworkPropertyMetadataOptions.Inherits));
  18. public static string GetBaseName(FrameworkElement obj)
  19. {
  20. return (string) obj.GetValue(BaseNameProperty);
  21. }
  22. public static void SetBaseName(FrameworkElement obj, string value)
  23. {
  24. obj.SetValue(BaseNameProperty, value);
  25. }
  26. }
  27. public class LocalNameExtension : MarkupExtension
  28. {
  29. private string m_Qualifier;
  30. public LocalNameExtension()
  31. {
  32. }
  33. public LocalNameExtension(string qualifier)
  34. {
  35. m_Qualifier = qualifier;
  36. }
  37. public override object ProvideValue(IServiceProvider serviceProvider)
  38. {
  39. var targetProvider = (IProvideValueTarget)
  40. serviceProvider.GetService(typeof(IProvideValueTarget));
  41. // MarkupExtension 在样式模板中,返回 this 以延迟提供值。
  42. //if (service.TargetObject.GetType().Name.EndsWith("SharedDp")) return this;
  43. // 如果不是 FrameworkElement,那么返回 this 以延迟提供值。
  44. FrameworkElement target = targetProvider.TargetObject as FrameworkElement;
  45. if (target==null) return this;
  46. //var target = (FrameworkElement)targetProvider.TargetObject;
  47. string name = LocalName.GetBaseName(target);
  48. if (m_Qualifier != null) { name += m_Qualifier; }
  49. return name;
  50. }
  51. }
  52. }