Найдите метку для целевого элемента UIE в WPF - PullRequest
1 голос
/ 28 января 2010

У меня есть следующий 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, кроме того, что вы уже видите здесь.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 15 ноября 2016

Следуя логике в комментарии к ответу Aviad, вы можете создать свое собственное присоединенное свойство (я бы сделал это для Label), и когда вы установите свойство, оно должно установить Target для метки и AutomationProperties.GetLabeledBy для элемента.

И если у вас есть несколько меток, сделайте это только с одной из них и просто установите Label.Target на остальные.

0 голосов
/ 28 января 2010

Помимо решения Джоша Эйнштейна, которое, если я не ошибаюсь, эквивалентно простому вызову статического метода 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...