WPF Özel Denetiminin UI Otomasyonu
Microsoft UI Otomasyonu , otomasyon istemcilerinin çeşitli platformların ve çerçevelerin kullanıcı arabirimlerini incelemek veya çalıştırmak için kullanabileceği tek, genelleştirilmiş bir arabirim sağlar. UI Otomasyonu hem kalite güvencesi (test) kodunu hem de ekran okuyucular gibi erişilebilirlik uygulamalarının kullanıcı arabirimi öğelerini incelemesini ve diğer kodlarla kullanıcı etkileşimlerinin benzetimini sağlar. Tüm platformlar hakkında UI Otomasyonu bilgi için bkz. Erişilebilirlik.
Bu konuda, bir WPF uygulamasında çalışan özel bir denetim UI Otomasyonu sunucu tarafı güvenlik sağlayıcısının nasıl uygulanarak gerçekleştiril açıklanmıştır. WPF, UI Otomasyonu kullanıcı arabirimi öğelerinin ağacına paralel olan eş otomasyon nesneleri ağacı aracılığıyla destekler. Test kodu ve erişilebilirlik özellikleri sağlayan uygulamalar otomasyon eş nesnelerini doğrudan (işlem kodu için) veya tarafından sağlanan genelleştirilmiş arabirim aracılığıyla UI Otomasyonu kullanabilir.
Otomasyon Eş Sınıfları
WPF UI Otomasyonu denetimleri, 'den türeten bir eş sınıf ağacı aracılığıyla destek AutomationPeer sağlar. Kural gereği, eş sınıf adları denetim sınıfı adıyla başlar ve "AutomationPeer" ile sona erer. Örneğin, ButtonAutomationPeer denetim sınıfı için eş Button sınıftır. Eş sınıflar, denetim türlerine kabaca UI Otomasyonu eşdeğerdir, ancak WPF öğelerine özeldir. WpF uygulamalarına arabirim üzerinden erişen otomasyon kodu doğrudan otomasyon eşlerini kullanmaz, ancak aynı işlem alanı otomasyon kodu doğrudan UI Otomasyonu otomasyon eşlerini kullanabilir.
Yerleşik Otomasyon Eş Sınıfları
Öğeler, kullanıcıdan arabirim etkinliğini kabul ederse veya ekran okuyucu uygulamalarının kullanıcılarına gereken bilgileri içeriyorsa bir otomasyon eş sınıfı uygulama. Tüm WPF görsel öğelerinin otomasyon eşleri olmaz. Otomasyon eşleri uygulayan sınıflara örnek olarak Button , TextBox ve yer Label almaktadır. Otomasyon eşlerini uygulamayan sınıflara örnek olarak , gibi ve ve gibi sınıflarını temel Decorator Border alan Panel sınıflardan Grid türetildi. Canvas
Temel Control sınıfın karşılık gelen bir eş sınıfı yok. 'den türetilen özel bir denetime karşılık gelen bir eş sınıfa ihtiyacınız varsa, özel Control eş sınıfını 'den türetin. FrameworkElementAutomationPeer
Türetilmiş Eşler için Güvenlik Konuları
Otomasyon eşleri kısmi güven ortamında çalıştırmalıdır. UIAutomationClient derlemesinde kod, kısmi güven ortamında çalıştıracak şekilde yapılandırılmamış ve otomasyon eş kodu bu derlemeye başvurmalıdır. Bunun yerine UIAutomationTypes derlemesinde sınıfları kullanabilirsiniz. Örneğin, UIAutomationClient derlemesinde sınıfına karşılık gelen AutomationElementIdentifiers UIAutomationTypes derlemesi AutomationElement sınıfını kullan gerekir. Otomasyon eş kodunda UIAutomationTypes derlemesine başvuru yapmak güvenlidir.
Eş Gezinti
Otomasyon eşlerini buluktan sonra, işlem kodu nesnenin ve yöntemlerini çağırarak eş ağacında GetChildren GetParent gezinebilirsiniz. Bir denetim içindeki WPF öğeleri arasında gezinme, eş öğenin yöntemi uygulaması tarafından GetChildrenCore de destekler. Sistem UI Otomasyonu, denetim içinde yer alan bir alt öğesi ağacı oluşturmak için bu yöntemi çağırıyor; Örneğin, liste kutusunda öğeleri listele. Varsayılan UIElementAutomationPeer.GetChildrenCore yöntem, otomasyon eşleri ağacını oluşturmak için öğelerin görsel ağacından geçiştir. Özel denetimler, bilgi aktaran veya kullanıcı etkileşimi sağlayan öğelerin otomasyon eşlerini döndürerek, otomasyon istemcilerinin diğer öğelerini ortaya çıkarmak için bu yöntemi geçersiz kılar.
Türetilen Eş'te Özelleştirmeler
'den türeten ve UIElement korumalı sanal yöntemini içeren tüm ContentElement OnCreateAutomationPeer sınıflar. Her denetim için otomasyon eş nesnesini almak için WPF OnCreateAutomationPeer çağrıları. Otomasyon kodu, bir denetimin özellikleri ve özellikleri hakkında bilgi almak ve etkileşimli kullanımın benzetimini yapmak için eş eşini kullanabilir. Otomasyonu destekleyen özel bir denetim, 'den OnCreateAutomationPeer türeten bir sınıfın örneğini geçersiz kılmalı ve geri AutomationPeer getirsin. Örneğin, bir özel denetim sınıfından türetmişse, tarafından ButtonBase döndürülen nesne ' den OnCreateAutomationPeer türet ButtonBaseAutomationPeer gerekir.
Özel bir denetim uygulanırken, özel denetiminize özgü ve benzersiz davranışı açıklayan temel otomasyon eş sınıfından "Çekirdek" yöntemlerini geçersiz kılmanız gerekir.
OnCreateAutomationPeer'i Geçersiz Kıl
Doğrudan veya dolaylı olarak 'den türetmiş olması gereken sağlayıcı nesnenizi döndüren özel OnCreateAutomationPeer denetiminizin yöntemini geçersiz AutomationPeer kılın.
GetPattern'i geçersiz kılma
Otomasyon eşleri sunucu tarafı sağlayıcıların bazı uygulama yönlerini basitleştirir, ancak özel denetim otomasyonu eşlerinin yine de desen UI Otomasyonu arabirimlerini işlemesi gerekir. WPF olmayan sağlayıcılar gibi eşler de gibi ad alanına arabirimlerin uygulanmasını sağlayarak denetim System.Windows.Automation.Provider desenlerini IInvokeProvider destekler. Denetim deseni arabirimleri, eş eş tarafından veya başka bir nesne tarafından kullanılabilir. Eş'in GetPattern uygulaması, belirtilen deseni destekleyen nesneyi döndürür. UI Otomasyonu kod yöntemini GetPattern çağırarak bir PatternInterface numaralama değeri belirtir. geçersiz GetPattern kılmanız, belirtilen deseni uygulayan nesneyi geri getirilmelidir. Denetiminiz bir desenin özel bir uygulamasına sahip yoksa, bu denetim türü için desteklenmiyorsa, temel türün uygulamasını çağırarak uygulamasını veya null değerini GetPattern alın. Örneğin, özel bir NumericUpDown denetimi bir aralık içindeki bir değere ayarlansa da eş UI Otomasyonu eş IRangeValueProvider arabirimini uygulayan bir değere sahip olabilir. Aşağıdaki örnek, bir değere yanıt vermek GetPattern için eşler yönteminin nasıl geçersiz kılınmış olduğunu PatternInterface.RangeValue gösterir.
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
Yöntem, GetPattern bir alt öğesi desen sağlayıcısı olarak da belirtebilirsiniz. Aşağıdaki kod, kaydırma deseni ItemsControl işlemeyi iç denetimi eşlerine nasıl aktarıyor? ScrollViewer
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
Bu kod, desen işleme için bir alt öğesi belirtmek için alt öğesi nesnesini alır, yöntemini kullanarak bir eş oluşturur, yeni eş özelliğini geçerli eş olarak ayarlar ve yeni eş CreatePeerForElement EventsSource döndürür. Bir alt öğesinde ayarı, alt elementin otomasyon eş ağacında görünmesini önler ve alt öğesi tarafından ortaya çıkan tüm olayları içinde belirtilen denetimden kaynak EventsSource olarak EventsSource gösterir. Denetim otomasyon ağacında görünmez ve oluşturulan ScrollViewer kaydırma olayları nesnesinden geliyor gibi ItemsControl görünür.
"Çekirdek" Yöntemlerini Geçersiz Kılma
Otomasyon kodu, eş sınıfının genel yöntemlerini çağırarak denetiminiz hakkında bilgi alır. Denetiminiz hakkında bilgi sağlamak için, denetim uygulamanız temel otomasyon eş sınıfı tarafından sağlanandan farklı olduğunda adı "Çekirdek" ile sona eren her yöntemi geçersiz kılın. Aşağıdaki örnekte gösterildiği gibi, denetiminizin en azından ve GetClassNameCore GetAutomationControlTypeCore yöntemlerini uygulaması gerekir.
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
uygulaması, GetAutomationControlTypeCore bir değer döndürerek denetiminizi ControlType açıklar. getiresiniz, ControlType.Custom ancak denetiminizi doğru bir şekilde açıklarsa daha belirli denetim türlerinden birini geri dönmeniz gerekir. dönüş değeri, sağlayıcının uygulaması için ek iş gerektirir ve istemci ürünleri denetim yapısını, klavye etkileşimini ve olası denetim ControlType.Custom UI Otomasyonu UI Otomasyonu desenlerini tahmin emiyor.
Denetiminizin IsContentElementCore veri içeriği içerdiğini veya kullanıcı arabiriminde (veya her ikisinde) etkileşimli bir rolü yerine getirip karşılamadığını belirtmek IsControlElementCore için ve yöntemlerini uygulama. Varsayılan olarak, her iki yöntem de true dönüştedir. Bu ayarlar, otomasyon ağacını filtrelemek için bu yöntemleri kullanan ekran okuyucular gibi otomasyon araçlarının kullanılabilirliğini artırır. Yönteminiz desen işlemeyi bir alt öğesi eş eşlemeye aktarıyorsa, alt öğesi eş yönteminin otomasyon ağacından alt öğesi eşini GetPattern IsControlElementCore gizlemek için false döndürür. Örneğin, içinde kaydırma bir tarafından işleniyor ve için otomasyon eşliği ile ilişkili ListBox ScrollViewer PatternInterface.Scroll GetPattern ScrollViewerAutomationPeer yönteminin tarafından ListBoxAutomationPeer döndürülür. Bu IsControlElementCore nedenle, yöntemini ScrollViewerAutomationPeer false döndürür, böylece ScrollViewerAutomationPeer otomasyon ağacında görünmez.
Otomasyon eş değeri, denetiminiz için uygun varsayılan değerleri sağlasa gerekir. Denetiminize başvurulan XAML'nin öznitelikler dahil olmak üzere çekirdek yöntemlerinizin eş uygulamalarınızı geçersiz AutomationProperties k olduğunu unutmayın. Örneğin, aşağıdaki XAML iki özelleştirilmiş özelliği olan bir düğme UI Otomasyonu oluşturur.
<Button AutomationProperties.Name="Special"
AutomationProperties.HelpText="This is a special button."/>
Desen Sağlayıcılarını Uygulama
Sahip olan öğe doğrudan öğesinden türetilse, özel bir sağlayıcı tarafından uygulanan arabirimler açıkça Control bildirilebilir. Örneğin, aşağıdaki kod bir aralık değeri uygulayan Control bir için bir eş bildirer.
public class RangePeer1 : FrameworkElementAutomationPeer, IRangeValueProvider { }
Public Class RangePeer1
Inherits FrameworkElementAutomationPeer
Implements IRangeValueProvider
End Class
Sahip olan denetim gibi belirli bir denetim türünden türetilen eş, eşdeğer türetilmiş RangeBase bir eş sınıfından türetilen olabilir. Bu durumda eş, 'den türetici olur RangeBaseAutomationPeer ve bu da temel bir uygulaması IRangeValueProvider sağlar. Aşağıdaki kod, bu tür bir eş bildirimini gösterir.
public class RangePeer2 : RangeBaseAutomationPeer { }
Public Class RangePeer2
Inherits RangeBaseAutomationPeer
End Class
Örnek bir uygulama için, NumericUpDown özel Visual Basic uygulayan ve tüketen C# veya kaynak koduna bakın.
Olayları Yükseltme
Otomasyon istemcileri otomasyon olaylarını abone olabilir. Özel denetimler, yöntemini çağırarak denetim durumunun değişikliklerini RaiseAutomationEvent bildirmesi gerekir. Benzer şekilde, bir özellik değeri değişirse yöntemini RaisePropertyChangedEvent çağırabilirsiniz. Aşağıdaki kod, denetim kodundan eş nesne almak ve bir olay yükseltmek için bir yöntem çağırmayı gösterir. İyileştirme olarak kod, bu olay türü için dinleyici olup olmadığını belirler. Olayı yalnızca dinleyiciler olduğunda yükselterek gereksiz ek yükü ortadan kaldırıyor ve denetimin yanıt veriyor olmaya devam ediyor.
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