Yanıtlar:
WPF, WinForms'dan biraz farklı bir yaklaşım benimser. API'da bir nesnenin otomasyonunun yerleşik hale getirilmesi yerine, nesnenin otomatikleştirilmesinden sorumlu her nesne için ayrı bir sınıfı vardır. Bu durumda, ButtonAutomationPeer
bu görevi gerçekleştirmek için.
ButtonAutomationPeer peer = new ButtonAutomationPeer(someButton);
IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();
İşte konuyla ilgili bir blog yazısı.
Not: IInvokeProvider
arayüz UIAutomationProvider
montajda tanımlanmıştır .
UIAutomationProvider
. Sonra eklemek zorundausing System.Windows.Automation.Peers; using System.Windows.Automation.Provider;
((IInvokeProvider) (new ButtonAutomationPeer(someButton).GetPattern(PatternInterface.Invoke)).Invoke();
IInvokeProvider
arayüz UIAutomationProvider
montajda tanımlanır .
JaredPar'ın dediği gibi Josh Smith'in Otomasyon hakkındaki makalesine başvurabilirsiniz. Ancak makalesinin yorumlarına bakarsanız, WPF kontrollerine karşı olayları yükseltmenin daha zarif bir yolunu bulacaksınız
someButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
Ben şahsen otomasyon akranları yerine yukarıdaki olanı tercih ederim.
new RoutedEventArgs(Button.ClickEvent)
benim için çalışmadı. Kullanmak zorunda kaldım new RoutedEventArgs(Primitives.ButtonBase.ClickEvent)
. Aksi takdirde, harika çalışıyor!
tıklama etkinliğini aramak istiyorsanız:
SomeButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
Ve düğmenin basılı gibi görünmesini istiyorsanız:
typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(SomeButton, new object[] { true });
ve bundan sonra bastırılmamış:
typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(SomeButton, new object[] { false });
veya ToggleButton'u kullanın
Kaynağa erişiminiz varsa, düğmeyi programlı olarak "tıklatmanın" bir yolu, düğmelerin OnClick olay işleyicisini aramak (veya daha WPF-y tarzında bir şeyler yapıyorsanız düğmeyle ilişkili ICommand'ı yürütmektir) ).
Bunu neden yapıyorsun? Örneğin, bir tür otomatik test mi yapıyorsunuz veya düğmenin farklı bir kod bölümünden gerçekleştirdiği işlemi gerçekleştirmeye mi çalışıyorsunuz?
As Greg D söyledi, ben bir alternatiftir düşünüyorum Automation
çağırmak için MVVM desen (tıklama etkinlik kaldırdı ve komut çalıştırılır) kullanılarak bir düğmesini tıklayın OnClick
yansıma kullanarak yöntemi:
typeof(System.Windows.Controls.Primitives.ButtonBase).GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(button, new object[0]);
Düğme işlevi için MVVM Komut kalıbını kullanırken (önerilen uygulama), Düğmenin etkisini tetiklemenin basit bir yolu aşağıdaki gibidir:
someButton.Command.Execute(someButton.CommandParameter);
Bu , düğmenin tetiklediği Command nesnesini kullanır ve XAML tarafından tanımlanan CommandParameter'ı iletir .
Otomasyon API çözümüyle ilgili sorun, UIAutomationProvider
proje / paket bağımlılığı olarak Framework derlemesine başvuru gerektirmesidir .
Bir alternatif, davranışı taklit etmektir. Aşağıda, genişletilmiş çözümüm de MVVM desenini bağlı komutları ile yoğunlaştırıyor - uzatma yöntemi olarak uygulandı :
public static class ButtonExtensions
{
/// <summary>
/// Performs a click on the button.<br/>
/// This is the WPF-equivalent of the Windows Forms method "<see cref="M:System.Windows.Forms.Button.PerformClick" />".
/// <para>This simulates the same behaviours as the button was clicked by the user by keyboard or mouse:<br />
/// 1. The raising the ClickEvent.<br />
/// 2.1. Checking that the bound command can be executed, calling <see cref="ICommand.CanExecute" />, if a command is bound.<br />
/// 2.2. If command can be executed, then the <see cref="ICommand.Execute(object)" /> will be called and the optional bound parameter is p
/// </para>
/// </summary>
/// <param name="sourceButton">The source button.</param>
/// <exception cref="ArgumentNullException">sourceButton</exception>
public static void PerformClick(this Button sourceButton)
{
// Check parameters
if (sourceButton == null)
throw new ArgumentNullException(nameof(sourceButton));
// 1.) Raise the Click-event
sourceButton.RaiseEvent(new RoutedEventArgs(System.Windows.Controls.Primitives.ButtonBase.ClickEvent));
// 2.) Execute the command, if bound and can be executed
ICommand boundCommand = sourceButton.Command;
if (boundCommand != null)
{
object parameter = sourceButton.CommandParameter;
if (boundCommand.CanExecute(parameter) == true)
boundCommand.Execute(parameter);
}
}
}