উত্তর:
ডাব্লুপিএফ এখানে উইনফর্মগুলির চেয়ে কিছুটা ভিন্ন পদ্ধতির গ্রহণ করে। এপিআই-তে অন্তর্নির্মিত কোনও বস্তুর অটোমেশনের পরিবর্তে, তাদের কাছে প্রতিটি বস্তুর জন্য পৃথক শ্রেণি রয়েছে যা এটি স্বয়ংক্রিয় করার জন্য দায়ী। এক্ষেত্রে 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
সমাবেশে সংজ্ঞায়িত করা হয় ।
জ্যারেডপাড়ের মতো বলেছিল যে আপনি অটোমেশনের দিকে জোশ স্মিথের নিবন্ধটি উল্লেখ করতে পারেন। তবে আপনি যদি তাঁর নিবন্ধটিতে মন্তব্যগুলি লক্ষ্য করেন তবে আপনি ডাব্লুপিএফ নিয়ন্ত্রণগুলির বিরুদ্ধে ঘটনা উত্থাপনের আরও মার্জিত উপায় খুঁজে পাবেন
someButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
আমি ব্যক্তিগতভাবে অটোমেশন পিয়ারের পরিবর্তে উপরেরটিটিকে পছন্দ করি।
new RoutedEventArgs(Button.ClickEvent)
আমার পক্ষে কাজ করে নি work আমাকে ব্যবহার করতে হয়েছিল 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 });
বা টগলবাটন ব্যবহার করুন
প্রোগ্রামটিমেটিকভাবে বোতামটি "ক্লিক" করার একটি উপায়, যদি আপনার উত্সটিতে অ্যাক্সেস থাকে তবে কেবল বোতামটির অনক্লিক ইভেন্ট হ্যান্ডলারটি কল করা (বা আপনি যদি আরও ডাব্লুপিএফ-ওয়াই পদ্ধতিতে কাজ করে থাকেন তবে বোতামটির সাথে সম্পর্কিত আইকোমন্ড কার্যকর করুন) to )।
তুমি কেন এটা করছ? উদাহরণস্বরূপ, আপনি কিছু ধরণের স্বয়ংক্রিয় পরীক্ষার কাজ করছেন বা বাটনটি কোডের ভিন্ন বিভাগ থেকে সম্পাদিত একই ক্রিয়াটি সম্পাদন করার চেষ্টা করছেন?
গ্রেগ ডি যেমন বলেছিলেন, আমি মনে করি Automation
এমভিভিএম প্যাটার্ন (ক্লিক ইভেন্ট উত্থাপিত এবং চালিত কমান্ড) ব্যবহার করে একটি বোতামে ক্লিক করার বিকল্পটি OnClick
প্রতিবিম্বটি ব্যবহার করে পদ্ধতিটিকে কল করা :
typeof(System.Windows.Controls.Primitives.ButtonBase).GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(button, new object[0]);
ব্যবহার করার সময় MVVM জন্য কমান্ড প্যাটার্ন বাটন ফাংশন (অনুশীলন প্রস্তাবিত), একটি সহজ উপায় ট্রিগার প্রভাব বোতাম নিম্নরূপ:
someButton.Command.Execute(someButton.CommandParameter);
এটি কমান্ড অবজেক্টটি ব্যবহার করবে যা বোতামটি ট্রিগার করে এবং এক্সএএমএল দ্বারা নির্ধারিত কমান্ডপ্যারামিটারটি পাস করবে ।
অটোমেশন এপিআই সলিউশনের সমস্যাটি হ'ল এটির জন্য 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);
}
}
}