我有以下XAML:
<StackPanel>
<Label Target="{Binding ElementName=txtSearch}" Content="_Search:" />
<TextBox x:Name="txtSearch" />
</StackPanel>
我有一个接受UIElement参数的扩展方法,如下所示:
static public class MyExtensionMethods
{
static public string GetLabelText(this UIElement element)
{
}
}
我想在GetLabelText方法中做的就是确定标记传递的UIElement的标签内容(如果有的话),并返回文本。例如,以下代码将返回“_Search:”:
string labelText = txtSearch.GetLabelText();
我听说你可以使用AutomationPeers做到这一点,但是我还没有太多关注UIAutomation的功能,并且似乎无法获得任何回报,但是在任何一个Automation示例上调用GetLabeledBy时都会返回null值我发现了。任何有效的答案都会有所帮助,但除了你在这里看到的内容外,我宁愿不必在我的XAML中做任何额外的事情。
有什么想法吗?
答案 0 :(得分:0)
除了Josh Einstein的解决方案,也就是说,如果我没有弄错,相当于简单地调用静态方法AutomationProperties.GetLabeledBy
,我看到这个问题的唯一解决方案是稍微修改XAML 强>:
<StackPanel>
<Label x:Name="lblSearch" Target="{Binding ElementName=txtSearch}" Content="_Search:" />
<TextBox x:Name="txtSearch" AutomationProperties.LabeledBy="{Binding ElementName=lblSearch}"/>
</StackPanel>
通过这样做,您可以通过调用文本框中的GetLabeledBy
来检索文本框的标签:
var labeledBy = AutomationProperties.GetLabeledBy(txtSearch);
Assert(labeledBy == lblSearch);
答案 1 :(得分:0)
遵循Aviad回复评论中的逻辑,您可以创建自己的附加属性(我会为Label制作),当您设置属性时,它应该在标签上设置Target,并在元素上设置AutomationProperties.GetLabeledBy。 / p>
如果您有多个标签,只能使用其中一个,只需在其余部分设置Label.Target。