जवाबों:
WPF यहां WinForms की तुलना में थोड़ा अलग दृष्टिकोण लेता है। एपीआई में निर्मित वस्तु के स्वचालन के बजाय, उनके पास प्रत्येक वस्तु के लिए एक अलग वर्ग है जो इसे स्वचालित करने के लिए जिम्मेदार है। इस मामले में आपको ButtonAutomationPeer
इस कार्य को पूरा करने की आवश्यकता है ।
ButtonAutomationPeer peer = new ButtonAutomationPeer(someButton);
IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();
यहाँ विषय पर एक ब्लॉग पोस्ट है।
नोट: IInvokeProvider
इंटरफ़ेस UIAutomationProvider
विधानसभा में परिभाषित किया गया है ।
UIAutomationProvider
। फिर जोड़ना थाusing System.Windows.Automation.Peers; using System.Windows.Automation.Provider;
((IInvokeProvider) (new ButtonAutomationPeer(someButton).GetPattern(PatternInterface.Invoke)).Invoke();
IInvokeProvider
इंटरफ़ेस UIAutomationProvider
विधानसभा में परिभाषित किया गया है ।
जैसे कि JaredPar ने कहा कि आप स्वचालन के प्रति जोश स्मिथ के लेख का उल्लेख कर सकते हैं। हालाँकि यदि आप उनके लेख के लिए टिप्पणियों के माध्यम से देखते हैं तो आपको WPF नियंत्रणों के खिलाफ घटनाओं को बढ़ाने का अधिक सुरुचिपूर्ण तरीका मिलेगा
someButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
मैं व्यक्तिगत रूप से स्वचालन साथियों के बजाय ऊपर पसंद करता हूं।
new RoutedEventArgs(Button.ClickEvent)
मेरे लिए काम नहीं किया। मुझे इस्तेमाल करना था new RoutedEventArgs(Primitives.ButtonBase.ClickEvent)
। अन्यथा, महान काम करता है!
अगर आप क्लिक इवेंट को कॉल करना चाहते हैं:
SomeButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
और यदि आप चाहते हैं कि बटन ऐसा लगे कि वह दबाया गया है:
typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(SomeButton, new object[] { true });
और उसके बाद नदारद:
typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(SomeButton, new object[] { false });
या ToggleButton का उपयोग करें
प्रोग्राम को बटन पर "क्लिक" करने का एक तरीका, यदि आपके पास स्रोत तक पहुंच है, तो बस बटन के ऑनक्लिक ईवेंट हैंडलर को कॉल करना है (या बटन से जुड़े ICommand को निष्पादित करें, यदि आप अधिक WPF-y तरीके से चीजें कर रहे हैं )।
आप यह क्यों कर रहे हैं? क्या आप किसी प्रकार का स्वचालित परीक्षण कर रहे हैं, उदाहरण के लिए, या उसी क्रिया को करने की कोशिश कर रहे हैं जो बटन कोड के एक अलग खंड से करता है?
जैसा कि ग्रेग डी ने कहा, मुझे लगता है कि Automation
MVVM पैटर्न का उपयोग करके बटन पर क्लिक करने का एक विकल्प (ईवेंट पर क्लिक किया गया और कमांड निष्पादित) को OnClick
प्रतिबिंब का उपयोग करके विधि को कॉल करना है :
typeof(System.Windows.Controls.Primitives.ButtonBase).GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(button, new object[0]);
बटन फ़ंक्शन के लिए MVVM कमांड पैटर्न का उपयोग करते समय (अनुशंसित अभ्यास), बटन के प्रभाव को ट्रिगर करने का एक सरल तरीका इस प्रकार है:
someButton.Command.Execute(someButton.CommandParameter);
यह कमांड ऑब्जेक्ट का उपयोग करेगा जिसे बटन ट्रिगर करता है और XAML द्वारा परिभाषित कमांडपैरमीटर पास करता है ।
ऑटोमेशन एपीआई समाधान के साथ समस्या यह है कि इसे UIAutomationProvider
प्रोजेक्ट / पैकेज निर्भरता के रूप में फ्रेमवर्क असेंबली के संदर्भ की आवश्यकता है ।
व्यवहार का अनुकरण करने के लिए एक विकल्प है। निम्नलिखित में मेरा विस्तारित समाधान है जो अपने सीमित आदेशों के साथ MVVM- पैटर्न का भी विस्तार करता है - विस्तार विधि के रूप में लागू किया गया है :
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);
}
}
}