miałem wiele problemów z WPF AutomationPeer
też.
Być może uda ci się rozwiązać problem, zmuszając elementy interfejsu użytkownika WPF do korzystania z niestandardowego programu AutomationPeer, który zachowuje się inaczej niż domyślny, nie zwracając elementów sterujących podrzędnych programu AutomationPeers. To może zatrzymać wszelkie UI automatyzacji pracy rzeczy, ale mam nadzieję, że w Twoim przypadku, jak w kopalni, nie jesteś przy użyciu automatyzacji UI ..
Tworzenie niestandardowego automatyki klasy rówieśniczej, która dziedziczy FrameworkElementAutomationPeer
i przesłania metodę GetChildrenCore
, aby zwracać pusta lista zamiast rówieśników automatyki sterowania dziećmi. To powinno zatrzymać problemy występujące, gdy coś próbuje powtórzyć przez drzewo AutomationPeers.
Zastępuj również GetAutomationControlTypeCore
, aby określić typ kontrolki, którego będziesz używać w trybie automatyzacji. W tym przykładzie przekazuję AutomationControlType
jako parametr konstruktora. Jeśli zastosujesz niestandardowy peer automatyzacji do swojego systemu Windows, powinno to rozwiązać twoje problemy, ponieważ myślę, że element główny jest używany do zwracania wszystkich dzieci.
public class MockAutomationPeer : FrameworkElementAutomationPeer
{
AutomationControlType _controlType;
public MockAutomationPeer(FrameworkElement owner, AutomationControlType controlType)
: base(owner)
{
_controlType = controlType;
}
protected override string GetNameCore()
{
return "MockAutomationPeer";
}
protected override AutomationControlType GetAutomationControlTypeCore()
{
return _controlType;
}
protected override List<AutomationPeer> GetChildrenCore()
{
return new List<AutomationPeer>();
}
}
Aby korzystać peer zwyczaj automatyzacji zastąpić metodę OnCreateAutomationPeer
w elemencie np UI Okno:
protected override System.Windows.Automation.Peers.AutomationPeer OnCreateAutomationPeer()
{
return new MockAutomationPeer(this, AutomationControlType.Window);
}
Czy możesz pokazać, gdzie w kodzie otrzymujesz wyjątek? – Terrance