使用 UI 自动化框架公开自定义属性
Exposing custom properties using UI Automation Framework
给定一个非常基本的 WinForms custom/user 控件,使用 System.Windows.Automation 可以在自定义属性中操作 built控制。
这样做是这样的:
public object GetPropertyValue(int propertyId)
{
if (propertyId == AutomationElementIdentifiers.NameProperty.Id)
{
return "Hello World!";
}
}
我想做的是将自定义属性公开给 ui 自动化,例如 ReadyState、LastAccessed 等。
这可能吗?
不,您不能扩展属性列表,而且由于您使用的 Winforms 具有较差的 UI 自动化支持(它使用带桥等的 IAccessible)这一事实,这变得复杂了。
您可以做的是向自动化树中添加一些假对象,例如,这是一个示例 Winforms UserControl 来执行此操作:
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
Button button = new Button();
button.Location = new Point(32, 28);
button.Size = new Size(75, 23);
button.Text = "MyButton";
Controls.Add(button);
Label label = new Label();
label.Location = new Point(49, 80);
label.Size = new Size(35, 13);
label.Text = "MyLabel";
Controls.Add(label);
MyCustomProp = "MyCustomValue";
}
public string MyCustomProp { get; set; }
protected override AccessibleObject CreateAccessibilityInstance()
{
return new UserControl1AccessibleObject(this);
}
protected class UserControl1AccessibleObject : ControlAccessibleObject
{
public UserControl1AccessibleObject(UserControl1 ownerControl)
: base(ownerControl)
{
}
public new UserControl1 Owner
{
get
{
return (UserControl1)base.Owner;
}
}
public override int GetChildCount()
{
return 1;
}
public override AccessibleObject GetChild(int index)
{
if (index == 0)
return new ValueAccessibleObject("MyCustomProp", Owner.MyCustomProp);
return base.GetChild(index);
}
}
}
public class ValueAccessibleObject : AccessibleObject
{
private string _name;
private string _value;
public ValueAccessibleObject(string name, string value)
{
_name = name;
_value = value;
}
public override AccessibleRole Role
{
get
{
return AccessibleRole.Text; // activate Value pattern
}
}
// note you need to override with member values, base value cannot always store something
public override string Value { get { return _value; } set { _value = value; } }
public override string Name { get { return _name; } }
}
这是它在自动化树中的显示方式(使用 inspect.exe 工具):
请注意,此技术还支持写回 属性,因为它基于 ValuePattern。
给定一个非常基本的 WinForms custom/user 控件,使用 System.Windows.Automation 可以在自定义属性中操作 built控制。
这样做是这样的:
public object GetPropertyValue(int propertyId)
{
if (propertyId == AutomationElementIdentifiers.NameProperty.Id)
{
return "Hello World!";
}
}
我想做的是将自定义属性公开给 ui 自动化,例如 ReadyState、LastAccessed 等。
这可能吗?
不,您不能扩展属性列表,而且由于您使用的 Winforms 具有较差的 UI 自动化支持(它使用带桥等的 IAccessible)这一事实,这变得复杂了。
您可以做的是向自动化树中添加一些假对象,例如,这是一个示例 Winforms UserControl 来执行此操作:
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
Button button = new Button();
button.Location = new Point(32, 28);
button.Size = new Size(75, 23);
button.Text = "MyButton";
Controls.Add(button);
Label label = new Label();
label.Location = new Point(49, 80);
label.Size = new Size(35, 13);
label.Text = "MyLabel";
Controls.Add(label);
MyCustomProp = "MyCustomValue";
}
public string MyCustomProp { get; set; }
protected override AccessibleObject CreateAccessibilityInstance()
{
return new UserControl1AccessibleObject(this);
}
protected class UserControl1AccessibleObject : ControlAccessibleObject
{
public UserControl1AccessibleObject(UserControl1 ownerControl)
: base(ownerControl)
{
}
public new UserControl1 Owner
{
get
{
return (UserControl1)base.Owner;
}
}
public override int GetChildCount()
{
return 1;
}
public override AccessibleObject GetChild(int index)
{
if (index == 0)
return new ValueAccessibleObject("MyCustomProp", Owner.MyCustomProp);
return base.GetChild(index);
}
}
}
public class ValueAccessibleObject : AccessibleObject
{
private string _name;
private string _value;
public ValueAccessibleObject(string name, string value)
{
_name = name;
_value = value;
}
public override AccessibleRole Role
{
get
{
return AccessibleRole.Text; // activate Value pattern
}
}
// note you need to override with member values, base value cannot always store something
public override string Value { get { return _value; } set { _value = value; } }
public override string Name { get { return _name; } }
}
这是它在自动化树中的显示方式(使用 inspect.exe 工具):
请注意,此技术还支持写回 属性,因为它基于 ValuePattern。