কীভাবে প্রোগ্রামে ডাব্লুপিএফ-এর একটি বোতাম ক্লিক করবেন?


144

যেহেতু button.PerformClick()ডাব্লুপিএফ- তে কোনও পদ্ধতি নেই , তাই প্রোগ্রামযুক্তভাবে ডাব্লুপিএফ বোতামটি ক্লিক করার কোনও উপায় আছে কি?

উত্তর:


128

ডাব্লুপিএফ এখানে উইনফর্মগুলির চেয়ে কিছুটা ভিন্ন পদ্ধতির গ্রহণ করে। এপিআই-তে অন্তর্নির্মিত কোনও বস্তুর অটোমেশনের পরিবর্তে, তাদের কাছে প্রতিটি বস্তুর জন্য পৃথক শ্রেণি রয়েছে যা এটি স্বয়ংক্রিয় করার জন্য দায়ী। এক্ষেত্রে 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সমাবেশে সংজ্ঞায়িত করা হয় ।
স্টিভেন র্যান্ডস 15

188

জ্যারেডপাড়ের মতো বলেছিল যে আপনি অটোমেশনের দিকে জোশ স্মিথের নিবন্ধটি উল্লেখ করতে পারেন। তবে আপনি যদি তাঁর নিবন্ধটিতে মন্তব্যগুলি লক্ষ্য করেন তবে আপনি ডাব্লুপিএফ নিয়ন্ত্রণগুলির বিরুদ্ধে ঘটনা উত্থাপনের আরও মার্জিত উপায় খুঁজে পাবেন

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

আমি ব্যক্তিগতভাবে অটোমেশন পিয়ারের পরিবর্তে উপরেরটিটিকে পছন্দ করি।


26
RaiseEvent সমাধানটি কেবল ইভেন্টটি উত্থাপন করে। এটি বাটনের সাথে যুক্ত কমান্ড কার্যকর করে না (যেমন স্কানার বলে)
এডুয়ার্ডো মোল্টেনি

4
আপনি যদি এক্সএএমএল যেমন <বাটন নাম = "এক্স" ক্লিক = "এক্স_ক্লিক" /> ব্যবহার করেন, ইভেন্টটি স্বাভাবিক হিসাবে ক্লিক হ্যান্ডলার দ্বারা ধরা পড়বে। আমার কাছ থেকে +1!
মেটাও

4
আমি ভিবি ব্যবহার করছি ... ভিবি আয়াত সি # এর কোডটি আলাদা কিনা তা নিশ্চিত নই, তবে new RoutedEventArgs(Button.ClickEvent)আমার পক্ষে কাজ করে নি work আমাকে ব্যবহার করতে হয়েছিল new RoutedEventArgs(Primitives.ButtonBase.ClickEvent)। অন্যথায়, দুর্দান্ত কাজ!
ব্রায়ানভিপিএস

3
@ এডুয়ার্ডো মল্টেনি এবং স্কানারের বিশদ বিবরণ জানাতে, আপনি কমান্ডগুলির দ্বারা প্রদত্ত ইসনেইনড কার্যকারিতাটি হারাবেন, সুতরাং আপনি যদি আপনার সমস্ত ইভেন্টগুলি সক্ষম হয় কিনা তা যাচাই করতে না চান, অটোমেশনপিয়ার আরও ভাল কাজ করে।
জাস্টিন পিহনি

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 });

বা টগলবাটন ব্যবহার করুন



5

প্রোগ্রামটিমেটিকভাবে বোতামটি "ক্লিক" করার একটি উপায়, যদি আপনার উত্সটিতে অ্যাক্সেস থাকে তবে কেবল বোতামটির অনক্লিক ইভেন্ট হ্যান্ডলারটি কল করা (বা আপনি যদি আরও ডাব্লুপিএফ-ওয়াই পদ্ধতিতে কাজ করে থাকেন তবে বোতামটির সাথে সম্পর্কিত আইকোমন্ড কার্যকর করুন) to )।

তুমি কেন এটা করছ? উদাহরণস্বরূপ, আপনি কিছু ধরণের স্বয়ংক্রিয় পরীক্ষার কাজ করছেন বা বাটনটি কোডের ভিন্ন বিভাগ থেকে সম্পাদিত একই ক্রিয়াটি সম্পাদন করার চেষ্টা করছেন?


এটি আমার সমস্যার একমাত্র সমাধান নয়, তবে যখন আমি এটি করার চেষ্টা করেছি তখন আমি দেখতে পেলাম যে এটি বোতামের মতো সহজ নয় er পারফর্মিক্লিক (), তাই কিছুটা কৌতূহলী ... :)
tghoang

আমাকে একই প্রকল্পের অন্য উইন্ডোর মেনুতে ক্লিক করতে হয়েছিল, এবং মায়োথারওয়াইন্ডো.মন্যু এন্ট্রি_ক্লিক (আমার, নতুন উইন্ডোজ। রুটড এভেন্টস আরগস) এটি করেছে। সত্যিই সহজ।
Andrea Antonangeli

4

গ্রেগ ডি যেমন বলেছিলেন, আমি মনে করি Automationএমভিভিএম প্যাটার্ন (ক্লিক ইভেন্ট উত্থাপিত এবং চালিত কমান্ড) ব্যবহার করে একটি বোতামে ক্লিক করার বিকল্পটি 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);

এটি কমান্ড অবজেক্টটি ব্যবহার করবে যা বোতামটি ট্রিগার করে এবং এক্সএএমএল দ্বারা নির্ধারিত কমান্ডপ্যারামিটারটি পাস করবে ।


একটি নোট, এটি ক্লিক করলে এই বোতামটির যে প্রভাবটি ঘটে তা কেবল ট্রিগার করে । এটি মেসেজ প্রেরণের কাতারে কোনও ক্লিক ইভেন্ট উত্পন্ন করে না। সমস্ত ব্যবহারিক ক্ষেত্রে এটি আপনার ইচ্ছা হবে এবং অপ্রয়োজনীয় প্রেরণকারী ইভেন্টগুলি এড়াতে পারবেন (যেমন আরও পারফরম্যান্ট) তবে যদি আপনার প্রকৃতপক্ষে প্রেরণের ইভেন্টগুলির প্রয়োজন হয় তবে উপরের অন্যান্য সমাধানগুলি আরও উপযুক্ত
কেভিকে কনসালটেন্সি

0

অটোমেশন এপিআই সলিউশনের সমস্যাটি হ'ল এটির জন্য UIAutomationProviderপ্রকল্প / প্যাকেজ নির্ভরতা হিসাবে ফ্রেমওয়ার্ক সমাবেশের একটি রেফারেন্স প্রয়োজন ।

একটি বিকল্প হ'ল আচরণ অনুকরণ করা। নিম্নলিখিতটিতে আমার বর্ধিত সমাধান রয়েছে যা এমভিভিএম-প্যাটার্নটিকে এর সীমাবদ্ধ কমান্ডগুলি সংযোজন করে - এক্সটেনশন পদ্ধতি হিসাবে প্রয়োগ করা :

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);
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.