четверг, 18 октября 2012 г.

Как сделать TextBlock внутри DataTemplate видимым для UIAutomation

Это вольный пересказ заметки http://www.wpftutorial.net/UIAutomation.html.

При UI автоматизации desktop приложений, мы можем столкнуться с ситуацией, когда TextBlock не является автоматизируемым контролом. Мы видим его в приложении, но при просмотре структуры автоматизируемых контролов через UISpy, он в ней не отображается. Это происходит в тех случаях, когда в xaml-коде окна TextBlock находится внутри DataTemplate. WPF специально скрывает такие TextBlock для увеличения производительности. Чтобы сделать их видимыми, нужно либо заменить их на контрол Label, что может ухудшить производительность, либо сделать специальный автоматизируемый UIAutomationTextBlock   на основе существующего TextBlock, и использовать в xaml-коде окна его.



public class UiAutomationTextBlock : TextBlock
{
    protected override AutomationPeer OnCreateAutomationPeer()
    {
        return new ModifiedTextBlockAutomationPeer(this);
    }
 
    private class ModifiedTextBlockAutomationPeer : TextBlockAutomationPeer
    {
        public ModifiedTextBlockAutomationPeer(TextBlock textBlock)
            : base(textBlock)
        { }
 
        protected override bool IsControlElementCore()
        {
            return true;
        }
    }
}

Комментариев нет:

Отправить комментарий