1

我有以下 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 功能,而且似乎无法从我的任何自动化示例中调用 GetLabeledBy 获得空值之外的任何东西成立。任何有效的答案都是最有帮助的,但我宁愿不必在我的 XAML 中做任何额外的事情,除了您已经在此处看到的内容。

有任何想法吗?

4

2 回答 2

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);
于 2010-01-28T09:16:55.813 回答
0

按照 Aviad 回复评论中的逻辑,您可以制作自己的附加属性(我会为标签制作),当您设置属性时,它应该在标签上设置 Target,在元素上设置 AutomationProperties.GetLabeledBy。

如果您有多个标签,只需对其中一个执行此操作,然后将 Label.Target 设置为其余标签。

于 2016-11-15T14:01:23.000 回答