Как можно Я определяю ControlTemplate для моего TabControl без прерывания автоматического тестирования?

Резюме

В моем приложении WPF мне был нужен TabControl с кнопками слева, поэтому я определил шаблон ControlTemplate с нужным макетом, и он работал нормально.

Тем не менее, мой тестер Мой тестер использует инструмент автоматического тестирования под названием QTP
. Он говорит, что может протестировать все, что вы можете увидеть с помощью UISpy.exe

  • Когда я использую прямой TabControl без примененного шаблона, UISpy может видеть содержимое выбранной в данный момент вкладки.
  • Однако, когда я использую ContentTemplate для изменения макета (код показан ниже), UISpy по-прежнему может видеть заголовки вкладок ... но не может видеть содержимое.

Пример приложения WPF (Xaml):


    
        
            
                
                
            
        
    
    
        
            
                
            
        
        
            
                
            
        
    

То, что мой поиск нашел до сих пор:

  • Куча материала о необходимости написать собственный TabControl с пользовательским AutomationPeer (например, MSFT ответ на вопрос форума UI Automation: доступ к элементу управления в ControlTemplate , публикация в блоге Пользовательские элементы управления и автоматизация пользовательского интерфейса ). Но каждый мой инстинкт говорит, что это сумасшедшее излишество, "должен быть более простой путь!" {function __call ($ name, $ args) {print ('вы пытались вызвать метод с именем:'. $ name); } } $ Obj = new MyClass (); но предложение catch никогда не вводится.

    Следующий код воспроизводит проблему (g ++ 4.2, Mac OS X 10.6):

    // library.cpp: exports f(), compiled with -fno-rtti
    #include 
    #include 
    extern "C" {
        void f() {
            try {
                throw std::invalid_argument("std::exception handler");
            } catch( std::exception& e) {
                std::cout << e.what() << "\n";
            } catch(...) {
                std::cout << "... handler\n";
            }
        }
    }
    

    // main.cpp: the main executable, dynamically loads the library
    #include 
    typedef void(*fPtr)();
    
    int main() {
        void* handle = dlopen( "./libexception_problem.dylib", RTLD_LAZY );
        fPtr p_f = reinterpret_cast( dlsym( handle, "f" ) );
        p_f();
    }
    

    Вывод:

    MacBook-Pro:teste pfranco$ # works fine with rtti
    MacBook-Pro:teste pfranco$ g++ -c library.cpp && g++ -shared -o libexception_problem.dylib library.o && g++ main.cpp -o main && ./main
    std::exception handler
    MacBook-Pro:teste pfranco$ # breaks with -fno-rtti
    MacBook-Pro:teste pfranco$ g++ -c -fno-rtti library.cpp && g++ -shared -o libexception_problem.dylib library.o && g++ -fno-rtti main.cpp -o main && ./main
    ... handler
    MacBook-Pro:teste pfranco$ #-no_dead_strip_inits_and_terms doesn't change anything
    MacBook-Pro:teste pfranco$ g++ -c -no_dead_strip_inits_and_terms -fno-rtti library.cpp && g++ -no_dead_strip_inits_and_terms -shared -o libexception_problem.dylib library.o && g++ -fno-rtti -no_dead_strip_inits_and_terms main.cpp -o main && ./main
    ... handler
    MacBook-Pro:teste pfranco$ # linking against the shared library works, but this isn't always an option
    MacBook-Pro:teste pfranco$ g++ -c -fno-rtti library.cpp && g++ -shared -o libexception_problem.dylib library.o && g++ -fno-rtti main.cpp -o main -L. -lexception_problem && ./main
    std::exception handler
    

    Это происходит только в том случае, если код, который выдает в разделяемой библиотеке , и только если перехваченный тип является базовым классом фактического исключения - catch (std :: invalid_argument &) отлично работает, ] std :: logic_error & нет.

    Интересно, что этого не происходит в Linux , даже когда выполняются точно такие же команды.

    Вопросы:

    1. Почему это случиться? Является ли это ошибкой, неопределенным поведением или дизайном?
    2. Как я могу заставить его работать, если не ссылаться на библиотеку?

    Большое спасибо.

6
задан Pedro d'Aquino 3 September 2010 в 17:46
поделиться