कैसे WPF में प्रोग्राम बटन पर क्लिक करें?


144

चूंकि button.PerformClick()WPF में कोई विधि नहीं है , तो क्या WPF बटन को प्रोग्रामेटिक रूप से क्लिक करने का कोई तरीका है?

जवाबों:


128

WPF यहां WinForms की तुलना में थोड़ा अलग दृष्टिकोण लेता है। एपीआई में निर्मित वस्तु के स्वचालन के बजाय, उनके पास प्रत्येक वस्तु के लिए एक अलग वर्ग है जो इसे स्वचालित करने के लिए जिम्मेदार है। इस मामले में आपको ButtonAutomationPeerइस कार्य को पूरा करने की आवश्यकता है ।

ButtonAutomationPeer peer = new ButtonAutomationPeer(someButton);
IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();

यहाँ विषय पर एक ब्लॉग पोस्ट है।

नोट: IInvokeProviderइंटरफ़ेस UIAutomationProviderविधानसभा में परिभाषित किया गया है ।


2
चालाक, मुझे इसकी जानकारी नहीं थी। स्वचालित परीक्षण के लिए बहुत उपयोगी हो सकता है। ध्यान दें कि उस लिंक पर एक टिप्पणी है जो खुद को बनाने के बजाय स्वचालन सहकर्मी को प्राप्त करने के लिए किसी दिए गए कारखाने का उपयोग करने का सुझाव देती है।
ग्रेग डी।

7
इसके लिए धन्यवाद। मैंने अपने ऐप में सही नामस्थान खोजने के लिए तब तक संघर्ष किया, जब तक मैंने एक संदर्भ नहीं जोड़ा UIAutomationProvider। फिर जोड़ना थाusing System.Windows.Automation.Peers; using System.Windows.Automation.Provider;
sergeantKK

5
झुकाव के लिए एक-लाइनर:((IInvokeProvider) (new ButtonAutomationPeer(someButton).GetPattern(PatternInterface.Invoke)).Invoke();
डैनी बेकेट

3
एक बात का ध्यान रखें कि इनवोक कॉल अतुल्यकालिक है। इसका मतलब है कि यदि आप इसे एक इकाई परीक्षण में उपयोग कर रहे हैं और आपकी अगली पंक्ति बटन पर क्लिक करने के अपेक्षित परिणाम की जांच करने के लिए है, तो आपको इंतजार करना पड़ सकता है।
डेनवर

3
बस संदर्भ के लिए, IInvokeProviderइंटरफ़ेस UIAutomationProviderविधानसभा में परिभाषित किया गया है ।
स्टीवन रैंड

188

जैसे कि JaredPar ने कहा कि आप स्वचालन के प्रति जोश स्मिथ के लेख का उल्लेख कर सकते हैं। हालाँकि यदि आप उनके लेख के लिए टिप्पणियों के माध्यम से देखते हैं तो आपको WPF नियंत्रणों के खिलाफ घटनाओं को बढ़ाने का अधिक सुरुचिपूर्ण तरीका मिलेगा

someButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));

मैं व्यक्तिगत रूप से स्वचालन साथियों के बजाय ऊपर पसंद करता हूं।


26
RaiseEvent समाधान केवल घटना को बढ़ाता है। यह बटन के साथ जुड़े कमांड को निष्पादित नहीं करता है (जैसा कि स्कानार कहते हैं)
एडुआर्डो

4
यदि आप XAML उदा <बटन का नाम = "X" क्लिक = "X_Click" /> का उपयोग करते हैं, तो ईवेंट सामान्य रूप से ऑन क्लिक हैंडलर द्वारा पकड़ा जाएगा। मुझ से +1!
मेटा

4
मैं VB का उपयोग कर रहा हूँ ... अगर VB छंद सी # के लिए कोड अलग है, तो निश्चित नहीं है, लेकिन new RoutedEventArgs(Button.ClickEvent)मेरे लिए काम नहीं किया। मुझे इस्तेमाल करना था new RoutedEventArgs(Primitives.ButtonBase.ClickEvent)। अन्यथा, महान काम करता है!
ब्रायन वीपीएस

3
@EduardoMolteni और Skanaar के बारे में विस्तार से बताने के लिए, आप इस तरह से दिए गए IsEnabled कार्यक्षमता को खो देते हैं, इसलिए जब तक आप नहीं चाहते कि आपकी सभी घटनाएँ जाँच लें कि क्या वे सक्षम हैं, तो स्वचालन बेहतर है।
जस्टिन पिहोनी

34

अगर आप क्लिक इवेंट को कॉल करना चाहते हैं:

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 का उपयोग करें



5

प्रोग्राम को बटन पर "क्लिक" करने का एक तरीका, यदि आपके पास स्रोत तक पहुंच है, तो बस बटन के ऑनक्लिक ईवेंट हैंडलर को कॉल करना है (या बटन से जुड़े ICommand को निष्पादित करें, यदि आप अधिक WPF-y तरीके से चीजें कर रहे हैं )।

आप यह क्यों कर रहे हैं? क्या आप किसी प्रकार का स्वचालित परीक्षण कर रहे हैं, उदाहरण के लिए, या उसी क्रिया को करने की कोशिश कर रहे हैं जो बटन कोड के एक अलग खंड से करता है?


यह मेरी समस्या का एकमात्र समाधान नहीं है, लेकिन जब मैंने ऐसा करने की कोशिश की, तो मैंने पाया कि यह बटन के रूप में आसान नहीं है।
PerformClick

मुझे उसी प्रोजेक्ट में एक अन्य विंडो के मेनू पर क्लिक करना था, और MyOtherWindow.mnuEntry_Click (Me, New Windows.RoutedEventArgs) ने इसे किया। वास्तव में सरल।
एंड्रिया एंटांगेली

4

जैसा कि ग्रेग डी ने कहा, मुझे लगता है कि AutomationMVVM पैटर्न का उपयोग करके बटन पर क्लिक करने का एक विकल्प (ईवेंट पर क्लिक किया गया और कमांड निष्पादित) को OnClickप्रतिबिंब का उपयोग करके विधि को कॉल करना है :

typeof(System.Windows.Controls.Primitives.ButtonBase).GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(button, new object[0]);

माता-पिता पर एक कमांड को फायर करने के लिए बच्चे के तत्व से एक घटना का उपयोग करने का यह एक अच्छा तरीका है।
कूल ब्लू

2

बटन फ़ंक्शन के लिए MVVM कमांड पैटर्न का उपयोग करते समय (अनुशंसित अभ्यास), बटन के प्रभाव को ट्रिगर करने का एक सरल तरीका इस प्रकार है:

someButton.Command.Execute(someButton.CommandParameter);

यह कमांड ऑब्जेक्ट का उपयोग करेगा जिसे बटन ट्रिगर करता है और XAML द्वारा परिभाषित कमांडपैरमीटर पास करता है


एक नोट, यह केवल उस प्रभाव को ट्रिगर करता है जो बटन पर क्लिक करने पर होगा। यह संदेश प्रेषण कतार में किसी भी क्लिक की घटनाओं को उत्पन्न नहीं करता है। सभी व्यावहारिक मामलों के लिए, यह वही है जो आप इच्छा करेंगे और अनावश्यक डिस्पैचर घटनाओं (जैसे अधिक प्रदर्शनकारी) से
बचेंगे

0

ऑटोमेशन एपीआई समाधान के साथ समस्या यह है कि इसे 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);
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.