在WPF中查找目标UIElement的标签

时间:2010-01-28 05:51:03

标签: c# .net wpf xaml uielement

我有以下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中做任何额外的事情。

有什么想法吗?

2 个答案:

答案 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。