เนื่องจากไม่มีbutton.PerformClick()
วิธีใน WPF จึงมีวิธีการคลิกปุ่ม WPF โดยทางโปรแกรมหรือไม่
เนื่องจากไม่มีbutton.PerformClick()
วิธีใน WPF จึงมีวิธีการคลิกปุ่ม WPF โดยทางโปรแกรมหรือไม่
คำตอบ:
WPF ใช้แนวทางที่แตกต่างจาก WinForms เล็กน้อย แทนที่จะมีระบบอัตโนมัติของวัตถุที่สร้างขึ้นใน API พวกเขามีคลาสแยกต่างหากสำหรับแต่ละวัตถุที่รับผิดชอบในการทำให้เป็นอัตโนมัติ ในกรณีนี้คุณต้องดำเนินการ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 กล่าวว่าคุณสามารถอ้างถึงบทความของ Josh Smith ที่มีต่อระบบอัตโนมัติ อย่างไรก็ตามหากคุณดูความคิดเห็นในบทความของเขาคุณจะพบวิธีที่สง่างามมากขึ้นในการเพิ่มกิจกรรมกับตัวควบคุม 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 });
และ unpressed หลังจากนั้น:
typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(SomeButton, new object[] { false });
หรือใช้ ToggleButton
this.PowerButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
วิธีหนึ่งในการ "คลิก" ปุ่มโดยทางโปรแกรมหากคุณมีสิทธิ์เข้าถึงแหล่งคือเพียงเรียกใช้ตัวจัดการเหตุการณ์ OnClick ของปุ่ม (หรือเรียกใช้งาน ICommand ที่เกี่ยวข้องกับปุ่มถ้าคุณทำสิ่งต่าง ๆ ในลักษณะ WPF-y )
ทำไมคุณทำเช่นนี้? คุณกำลังทำการทดสอบแบบอัตโนมัติเช่นหรือพยายามดำเนินการแบบเดียวกันกับที่ปุ่มทำงานจากรหัสส่วนอื่นหรือไม่?
ดังที่Greg Dกล่าวว่าฉันคิดว่าทางเลือกใน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);
นี้จะใช้คำสั่งวัตถุที่ปุ่มทริกเกอร์และผ่านการCommandParameterกำหนดโดยXAML
ปัญหาเกี่ยวกับโซลูชัน API อัตโนมัติคือต้องมีการอ้างอิงถึงแอสเซมบลี Framework เป็นการอ้างอิง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);
}
}
}