Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A felhasználói felület automatizálása egyetlen, általánosított felületet biztosít, amellyel az automatizálási ügyfelek különböző platformok és keretrendszerek felhasználói felületeinek vizsgálatára vagy üzemeltetésére használhatók. A felhasználói felület automatizálása lehetővé teszi a minőségbiztosítási (tesztelési) kód és az akadálymentességi alkalmazások, például a képernyőolvasók számára, hogy megvizsgálják a felhasználói felület elemeit, és más kódból szimulálják azokkal való felhasználói interakciót. Az összes platform felhasználói felületi automatizálásáról további információt az Akadálymentesség című témakörben talál.
Ez a témakör azt ismerteti, hogyan implementálhat kiszolgálóoldali UI Automation-szolgáltatót egy WPF-alkalmazásban futó egyéni vezérlőhöz. A WPF a felhasználói felületi elemek fájával párhuzamos társautomatizálási objektumok fán keresztül támogatja a felhasználói felület automatizálását. Az akadálymentességi funkciókat biztosító tesztkódok és alkalmazások közvetlenül (a folyamaton belüli kódhoz) vagy a felhasználói felület Automation által biztosított általános felületen használhatják az automatizálási társobjektumokat.
Automation társosztályok
A WPF-vezérlők támogatják a felhasználói felület automatizálását egy osztályhierarchián keresztül, amelyen belül a társosztályok AutomationPeer-ból származnak. Konvenció szerint a társosztálynevek a vezérlőosztály nevével kezdődnek, és az "AutomationPeer" végződéssel végződnek. Például a ButtonAutomationPeer vezérlőosztály társosztálya a Button. A társosztályok nagyjából egyenértékűek a felhasználói felület automatizálásának vezérlési típusaival, de a WPF-elemekre jellemzőek. A WPF-alkalmazásokat a felhasználói felület automatizálási felületén keresztül elérő automation-kód nem használ közvetlenül automatizálási társokat, de az ugyanabban a folyamattérben lévő automatizálási kód közvetlenül használhat automatizálási társokat.
Beépített automation társosztályok
Az elemek akkor implementálnak egy automatizálási társosztályt, ha elfogadják a felhasználó felületi tevékenységeit, vagy ha képernyőolvasó alkalmazások felhasználói számára szükséges információkat tartalmaznak. Nem minden WPF-vizualizációelem rendelkezik automatizálási társokkal. Az automatizálási társokat megvalósító osztályok például a következőkButton: és TextBoxLabel. Az automatizálási társokat nem megvalósító osztályok például olyan osztályok, amelyek például Decoratora következőkből Borderszármaznak, és az olyan osztályok, Panelmint például Grid az és Canvasa.
Az alaposztály Control nem rendelkezik megfelelő társosztálysal. Ha egy társosztályra van szüksége, amely egy olyan egyéni vezérlőelemnek felel meg, amelyből Controlszármazik, az egyéni társosztályt a következőből FrameworkElementAutomationPeerkell származtatnia.
Származtatott társokkal kapcsolatos biztonsági szempontok
Az automation-társnak részleges megbízhatósági környezetben kell futnia. A UIAutomationClient-szerelvény kódja nincs részleges megbízhatósági környezetben való futtatásra konfigurálva, és az automatizálási társkód nem hivatkozhat erre a szerelvényre. Ehelyett a UIAutomationTypes szerelvény osztályait kell használnia. Használhatja például a AutomationElementIdentifiers UIAutomationTypes szerelvény osztályát, amely a AutomationElement UIAutomationClient szerelvény osztályának felel meg. Nyugodtan hivatkozhat az UIAutomationTypes összeállításra az automatizálási peer kódban.
Társnavigáció
Miután az automatizálási társ lokalizálva lett, a folyamaton belüli kód az objektum GetChildren és GetParent metódusainak meghívásával navigálhat a társfában. A WPF-elemek közötti navigációt egy vezérlőben a társ GetChildrenCore metódusának implementálása támogatja. A felhasználói felület automatizálási rendszere ezt a módszert arra hívja, hogy hozzon létre egy vezérlőn belül található alelemek fáját; például listaelemek egy listamezőben. Az alapértelmezett UIElementAutomationPeer.GetChildrenCore módszer bejárja az elemek vizualizációs fáját az automatizálási társviszonyok fájának létrehozásához. Az egyéni vezérlők felülbírálják ezt a módszert, hogy elérhetővé tegyék az automatizálási programok számára a gyermekelemeket, és visszaadják azoknak az elemeknek az automatizálási társviszonyait, amelyek információt közvetítenek vagy lehetővé teszik a felhasználói interakciót.
Származtatott csomópont testreszabásai
Minden osztály, amely a UIElement-ból és a ContentElement-ből származik, tartalmazza a védett virtuális metódust OnCreateAutomationPeer. A WPF hívja meg a OnCreateAutomationPeer-t, hogy lekérje az automatizálási társobjektumot az egyes vezérlőkhöz. Az Automation-kód a társ használatával információkat szerezhet egy vezérlő jellemzőiről és funkcióiról, és interaktív használatot szimulálhat. Az automatizálást támogató egyéni vezérlőknek felül kell bírálnia OnCreateAutomationPeer és vissza kell adnia egy osztály egy példányát, amelyből származik AutomationPeer. Ha például egy egyéni vezérlő az ButtonBase osztályból származik, akkor a visszaadott OnCreateAutomationPeer objektumnak a következőből ButtonBaseAutomationPeerkell származnia.
Egyéni vezérlők implementálásakor felül kell írnia az alapszintű automatikus peer osztály "Core" metódusait, amelyek az egyéni vezérlőre jellemző egyedi viselkedést írnak le.
Az OnCreateAutomationPeer felülbírálása
Írd felül a OnCreateAutomationPeer metódust az egyéni vezérlődben, hogy az visszaadja a szolgáltató objektumot, amelynek közvetlenül vagy közvetve a AutomationPeer-ből kell származnia.
GetPattern felülbírálása
Az automatizálási társok egyszerűsítik a kiszolgálóoldali felhasználói felület automatizálási szolgáltatók bizonyos implementációs aspektusait, de az egyéni vezérlési automatizálási társaknak továbbra is kezelniük kell a mintafelületeket. A nem WPF-szolgáltatókhoz hasonlóan a társhálózatok is támogatják az System.Windows.Automation.Provider ellenőrzési mintákat azáltal, hogy a névtérben lévő interfészek implementációit biztosítják, például IInvokeProvider. A vezérlőminta-illesztőket az objektum önmaga vagy egy másik objektum implementálhatja. A társ implementációja GetPattern a megadott mintát támogató objektumot adja vissza. A UI Automation-kód meghívja a GetPattern metódust, és megad egy PatternInterface számbavételi értéket. Az Ön GetPattern felülbírálásának egy olyan objektumot kell visszaadnia, amely megvalósítja a megadott mintát. Ha a vezérlő nem rendelkezik minta egyéni implementációjával, meghívhatja az alaptípus implementációját annak implementációjának vagy null értékének GetPattern lekéréséhez, ha a minta nem támogatott ehhez a vezérlőtípushoz. Az egyéni numerikus léptető vezérlőket például be lehet állítani egy tartományon belüli értékre, így a UI Automation társavezérlőjének implementálnia kell az IRangeValueProvider interfészt. A következő példa azt mutatja be, hogyan írja felül a partner GetPattern metódusát, hogy reagáljon a PatternInterface.RangeValue értékre.
public override object GetPattern(PatternInterface patternInterface)
{
if (patternInterface == PatternInterface.RangeValue)
{
return this;
}
return base.GetPattern(patternInterface);
}
Public Overrides Function GetPattern(ByVal patternInterface As PatternInterface) As Object
If patternInterface = PatternInterface.RangeValue Then
Return Me
End If
Return MyBase.GetPattern(patternInterface)
End Function
A GetPattern metódus mintaszolgáltatóként egy alelemet is megadhat. Az alábbi kód bemutatja, hogyan ItemsControl továbbítja a görgetési minta kezelését a belső ScrollViewer vezérlő társának.
public override object GetPattern(PatternInterface patternInterface)
{
if (patternInterface == PatternInterface.Scroll)
{
ItemsControl owner = (ItemsControl) base.Owner;
// ScrollHost is internal to the ItemsControl class
if (owner.ScrollHost != null)
{
AutomationPeer peer = UIElementAutomationPeer.CreatePeerForElement(owner.ScrollHost);
if ((peer != null) && (peer is IScrollProvider))
{
peer.EventsSource = this;
return (IScrollProvider) peer;
}
}
}
return base.GetPattern(patternInterface);
}
Public Class Class1
Public Overrides Function GetPattern(ByVal patternInterface__1 As PatternInterface) As Object
If patternInterface1 = PatternInterface.Scroll Then
Dim owner As ItemsControl = DirectCast(MyBase.Owner, ItemsControl)
' ScrollHost is internal to the ItemsControl class
If owner.ScrollHost IsNot Nothing Then
Dim peer As AutomationPeer = UIElementAutomationPeer.CreatePeerForElement(owner.ScrollHost)
If (peer IsNot Nothing) AndAlso (TypeOf peer Is IScrollProvider) Then
peer.EventsSource = Me
Return DirectCast(peer, IScrollProvider)
End If
End If
End If
Return MyBase.GetPattern(patternInterface1)
End Function
End Class
A mintakezelés alelrendezésének megadásához ez a kód lekéri a segédelosztó objektumot, létrehoz egy társt a CreatePeerForElement módszerrel, beállítja az EventsSource új társ tulajdonságát az aktuális társra, és visszaadja az új társt. A EventsSource beállítása alárendelt elemként megakadályozza, hogy az alárendelt elem megjelenjen az automatizálási társfában, és az alárendelt elem által kiváltott összes eseményt a megadott EventsSource vezérlőelemből származóként jelöli meg. A ScrollViewer vezérlő nem jelenik meg az automatizálási fában, és úgy tűnik, hogy az általa létrehozott görgetési események az ItemsControl objektumból származnak.
A "Core" metódusok felülbírálása
Az automatikus kód a partner osztály nyilvános metódusainak meghívásával kap információt a vezérlésről. A vezérlővel kapcsolatos információk megadásához írjon felül minden olyan metódust, amelynek neve "Core"-ra végződik, ha a vezérlő implementációja eltér az alap automatizálási peer/osztály által biztosítottól. A vezérlőnek legalább a GetClassNameCore és GetAutomationControlTypeCore metódusokat kell implementálnia, ahogy az az alábbi példában is látható.
protected override string GetClassNameCore()
{
return "NumericUpDown";
}
protected override AutomationControlType GetAutomationControlTypeCore()
{
return AutomationControlType.Spinner;
}
Protected Overrides Function GetClassNameCore() As String
Return "NumericUpDown"
End Function
Protected Overrides Function GetAutomationControlTypeCore() As AutomationControlType
Return AutomationControlType.Spinner
End Function
Az implementációja GetAutomationControlTypeCore egy ControlType értéket visszaadva írja le a vezérlőt. Bár visszatérhet ControlType.Custom-hoz, a konkrétabb vezérlőtípusok egyikét kell választania, ha az pontosan leírja a vezérlőt. A visszatérési ControlType.Custom érték további munkát igényel a szolgáltató számára a felhasználói felületi automatizálás implementálásához, és a felhasználói felület automation-ügyféltermékei nem tudják előre látni a vezérlőstruktúrát, a billentyűzet interakcióját és a lehetséges vezérlési mintákat.
Implementálja azokat a IsContentElementCore módszereket és IsControlElementCore módszereket, hogy jelezze, hogy a vezérlő tartalmaz-e adattartalmat, vagy egy interaktív szerepkört tölt be a felhasználói felületen (vagy mindkettőben). Alapértelmezés szerint mindkét metódus ad vissza true
. Ezek a beállítások javítják az automatizálási eszközök, például a képernyőolvasók használhatóságát, amelyek ezeket a módszereket használhatják az automatizálási fa szűréséhez. Ha a GetPattern metódus a mintakezelést egy aljellemző társelemre ruházza át, az aljellemző társelem IsControlElementCore metódusa hamis értéket adhat vissza, hogy elrejtse az automatizálási fa elől. Például a görgetést egy ListBox egy ScrollViewer kezeli, és a PatternInterface.Scroll automatizálási társat a GetPatternScrollViewerAutomationPeer metódusa adja vissza, amely a ListBoxAutomationPeer-hoz kapcsolódik. Ezért a IsControlElementCoreScrollViewerAutomationPeer metódusa visszaad egy false
-t, így az ScrollViewerAutomationPeer nem jelenik meg az automatizálási fában.
Az automatizálási társnak megfelelő alapértelmezett értékeket kell biztosítania a vezérlőhöz. Vegye figyelembe, hogy a vezérlőre hivatkozó XAML felülbírálhatja a fő metódusok peer implementációit AutomationProperties attribútumokkal. A következő XAML például létrehoz egy gombot, amely két testre szabott felhasználói felületi Automation-tulajdonsággal rendelkezik.
<Button AutomationProperties.Name="Special"
AutomationProperties.HelpText="This is a special button."/>
Mintaszolgáltatók implementálása
Az egyéni szolgáltató által implementált interfészek explicit módon vannak deklarálva, ha a tulajdonos elem közvetlenül a Controlből származik. Az alábbi kód például egy Control-hoz tartozó társat deklarál, amely megvalósít egy tartomány értékét.
public class RangePeer1 : FrameworkElementAutomationPeer, IRangeValueProvider { }
Public Class RangePeer1
Inherits FrameworkElementAutomationPeer
Implements IRangeValueProvider
End Class
Ha a tulajdonosi vezérlő egy adott típusú vezérlőből származik, például RangeBase, akkor a társ egy azzal egyenértékű származtatott társosztályból származtatható. Ebben az esetben a csomópont a RangeBaseAutomationPeer-ből származik, amely egy alapimplementációt biztosít a IRangeValueProvider számára. Az alábbi kód egy ilyen partner deklarációját mutatja.
public class RangePeer2 : RangeBaseAutomationPeer { }
Public Class RangePeer2
Inherits RangeBaseAutomationPeer
End Class
Példaként tekintse meg a NumerikusupDown egyéni vezérlőt implementáló és használó C# vagy Visual Basic forráskódot.
Események indítása
Az Automation-ügyfelek előfizethetnek az automatizálási eseményekre. Az egyéni vezérlőknek az RaiseAutomationEvent metódus meghívásával kell jelenteni az állapotváltozásokat. Hasonlóképpen, ha egy tulajdonság értéke megváltozik, hívja meg a metódust RaisePropertyChangedEvent . Az alábbi kód bemutatja, hogyan szerezheti be a társobjektumot a vezérlőkódból, és hogyan hívhat meg egy metódust egy esemény indításához. Optimalizálásként a kód meghatározza, hogy vannak-e figyelők ehhez az eseménytípushoz. Az esemény csak akkor emelhető fel, ha vannak figyelők, elkerüli a felesleges többletterhelést, és segít a vezérlőnek a válaszkészségben maradni.
if (AutomationPeer.ListenerExists(AutomationEvents.PropertyChanged))
{
NumericUpDownAutomationPeer peer =
UIElementAutomationPeer.FromElement(nudCtrl) as NumericUpDownAutomationPeer;
if (peer != null)
{
peer.RaisePropertyChangedEvent(
RangeValuePatternIdentifiers.ValueProperty,
(double)oldValue,
(double)newValue);
}
}
If AutomationPeer.ListenerExists(AutomationEvents.PropertyChanged) Then
Dim peer As NumericUpDownAutomationPeer = TryCast(UIElementAutomationPeer.FromElement(nudCtrl), NumericUpDownAutomationPeer)
If peer IsNot Nothing Then
peer.RaisePropertyChangedEvent(RangeValuePatternIdentifiers.ValueProperty, CDbl(oldValue), CDbl(newValue))
End If
End If
Lásd még
.NET Desktop feedback