WPF DependencyProperty覆盖所有控件的Uid

问题描述:

我想要这样做的原因是UI自动化。我们的UI自动化软件通过Name/Uid属性查找元素。 name属性不能绑定任何东西,而且Uid似乎只有一个OneTime绑定(即使设置为OneWay)。绑定标签属性起作用但具有视觉效果。所以这个想法是为覆盖Uid属性的所有UI元素创建我自己的属性。WPF DependencyProperty覆盖所有控件的Uid

这里是我到目前为止,我怎么想它可以工作

namespace MyApplication.Shared.Controls 
{ 
    public class RxUidAttributeExtension : Control 
    { 
     public static readonly DependencyProperty RxUidProperty = DependencyProperty.RegisterAttached("RxUid", typeof(string), typeof(RxUidAttributeExtension), new FrameworkPropertyMetadata("", RxUidChanged) 
     { 
      BindsTwoWayByDefault = true, 
      DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged 
     }); 

     private static void RxUidChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      var metadata = RxUidProperty.GetMetadata(typeof(RxUidAttributeExtension)); 
      UidProperty.OverrideMetadata(typeof(UIElement), new UIPropertyMetadata("RxOverridden")); //override Uid property -> exception 
     } 

     public static string GetRxUid(DependencyObject d) 
     { 
      return (string)d.GetValue(RxUidProperty); 
     } 

     public static void SetRxUid(DependencyObject d, string value) 
     { 
      d.SetValue(RxUidProperty, value); 
     } 
    } 
} 

而且在XAML:

<DockPanel Name="myNameNeverChanges" 
        controls:RxUidAttributeExtension.RxUid="{Binding MyProperty, Mode=OneWay}" /> 

我要的是,在RxUid变化影响的uid属性。

为什么我认为这应该工作:Link - “你可以覆盖任何依赖属性的元数据”。 例外了一些关于已注册:/

  • 列表项

好它的工作原理是@Clemens建议,但它似乎也的UID单向工作,所以我的整个问题已经过时了。这只是Ranorex间谍工具没有正确显示已更改的Uid。测试工作完美,它只是间谍工具有这个小缺陷。

这里是一个版本,是有点更清洁的替代铸造:

d.SetValue(UIElement.UidProperty, e.NewValue); //override Uid property