using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Markup; namespace FWindSoft.Wpf { public class LocalName : DependencyObject { //子元素继承属性 public static readonly DependencyProperty BaseNameProperty = DependencyProperty.RegisterAttached("BaseName", typeof(string), typeof(LocalName), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits)); public static string GetBaseName(FrameworkElement obj) { return (string) obj.GetValue(BaseNameProperty); } public static void SetBaseName(FrameworkElement obj, string value) { obj.SetValue(BaseNameProperty, value); } } public class LocalNameExtension : MarkupExtension { private string m_Qualifier; public LocalNameExtension() { } public LocalNameExtension(string qualifier) { m_Qualifier = qualifier; } public override object ProvideValue(IServiceProvider serviceProvider) { var targetProvider = (IProvideValueTarget) serviceProvider.GetService(typeof(IProvideValueTarget)); // MarkupExtension 在样式模板中,返回 this 以延迟提供值。 //if (service.TargetObject.GetType().Name.EndsWith("SharedDp")) return this; // 如果不是 FrameworkElement,那么返回 this 以延迟提供值。 FrameworkElement target = targetProvider.TargetObject as FrameworkElement; if (target==null) return this; //var target = (FrameworkElement)targetProvider.TargetObject; string name = LocalName.GetBaseName(target); if (m_Qualifier != null) { name += m_Qualifier; } return name; } } }