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