为了在WPF表单中记录用户操作,我添加了一些全局事件处理程序
我想确切地记录哪个控件触发事件,是否有像ASP.Net中的ClientId这样的wpf UIElement
的唯一标识符?
为什么不使用哈希代码。
您可以比较这些值以确保它们是相同的对象,并且使用.GetHashCode()
很容易获得它们
编辑
显然,每次运行程序时都会有所不同,所以实际上这是一个坏主意,除非您想在每次记录进程时更新日志。尽管仍有可能
我的意思是,在创建日志时,可以为每个对象存储一个哈希值,但我不知道我是否喜欢
似乎我找到了问题的答案,答案是否定的,现在就这样做吧,正如MSDN中所指出的(http://msdn.microsoft.com/en-us/magazine/dd483216.aspx)
请注意,顶级Window控件定义不包含Name属性。这一点意义重大,因为我们很快就会看到,当您编写测试自动化时,一种简单的方法可以获得对使用MUIA库的控制是访问AutomationId属性,它是由编译器根据控件的Name属性生成的。没有XAML Name属性的控件将不会接收AutomationId属性。这个想法是一个具体的、低级的例子考虑应用程序设计问题的重要性例如安全性、可扩展性和测试自动化。
实现这一点的一种方法是使用自定义属性。就像这样…
要记录的UIElement
(例如UserControl):
[UserInterfaceID(ID = "{F436E9B3-C2F6-4CF8-8C75-0A2A756F1C74}")]
public partial class MyUserControl : UserControl
{
InitializeComponent();
// or whatever...
}
然后你需要自定义属性类
[System.AttributeUsage(AttributeTargets.Class)]
public class UserInterfaceIDAttribute : Attribute
{
public Guid ID { get; set; }
}
现在在你的代码中,你可以做这样的事情:
MyUserControl control = new MyUserControl();
foreach(object att in control.GetCustomAttributes(typeof(UserInterfaceAttribute),false))
{
UserInterfaceAttribute uiAtt = (UserInterfaceAttribute)att;
Guid theID = uiAtt.ID;
}
因为您在代码中使用属性标记控件,所以无论您终止/启动应用程序多少次,唯一标识符都不会更改。
当然,这是一个展示如何访问ID的基本示例,但您可能希望使用某种类型的面向方面编程。我正是用温莎城堡拦截机做这种事情的,但这超出了本文的范围。
理想情况下,当发生某种事件时,您将访问此ID。使用拦截器可以在调用方法调用之前捕获方法调用,其中可以查找如上所示的ID并记录操作。或者,您可以直接使用
this.GetCustomAttributes(...)
在某些方法中,当控件上触发事件时,并将日志记录代码嵌入其中。这种模式不是最好的,因为你在让某种类型的面向方面编程方法变得更好的过程中到处都是交叉关注。。。但我又跑题了,这超出了这篇文章的范围。。。但你明白了。
希望这能有所帮助。
您只是想添加一个Name
或x:Name
,以便Window
/UserControl
/Page
将控件公开给具有指定名称的类的其余部分。
<Window ...>
<Grid>
...
<!-- These controls are named, so you can access them directly by name -->
<Button x:Name="btnMyNamedButton" ... />
<Button Name="btnMyOtherNamedButton" ... />
<!-- This control is not named, so you can not directly access it by name -->
<Button ... />
<Grid>
</Window>
public partial class MyWindow : Window
{
public MyWindow()
{
InitializeComponent();
//btnMyNamedButton can be accessed
//btnMyOtherNamedbutton can also be accessed
//The third button can be accessed, but not directly by name.
}
}
此外,您还可以始终使用FrameworkElement.Tag对象。它用于存储任意信息,因此如果您愿意,可以将其用作唯一标识符。
我相信,为了记录用户操作,您可以使用UIAutomation树和AutomationElement.AutomationId属性,因为默认情况下,所有标准UI控件都支持这种方法。许多第三方控件也支持其元素(例如网格单元格)的AutomationId。AutomationId对于创建测试自动化脚本非常有用。
请参阅FrameworkElement.Tag属性
可以使用Tag
属性。它的类型为object
,可以设置为任何值。
我认为UIElement.Uid
应该工作。在XAML中分配它,并在代码中访问它。
<Label Uid="FirstName"/>
样式属性中的OR
<Setter Property="Uid" Value="SecondName"/>
然后参考C#代码:
if(Keyboard.FocupedElement是UIElement UIElement){Debug.WriteLine(this,$"{uiElement.Uid}");}