2013-05-28 95 views
0

如何在我的代码中直接触发按钮单击?如何在我的代码中点击按钮点击?

我有这样的代码:

namespace App1 
{ 
    /// <summary> 
    /// An empty page that can be used on its own or navigated to within a Frame. 
    /// </summary> 
    public sealed partial class MainPage : Page 
    { 
     public MainPage() 
     { 
      this.InitializeComponent(); 
     } 

     protected override void OnNavigatedTo(NavigationEventArgs e) 
     { 
      // fire a click ebent von the "Button" MyBtn 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      // ... 
     } 
    } 
} 

是否有可能触发一个click事件冯按钮MyBtn?如果是的话如何?

我知道我可以调用Button_Click方法,但我想通过按钮调用它。

类似:MyBtn.FireClickEvent();

+6

真搞不懂这个要求,如果你需要执行在button_click代码提取它在一个单独的方法和你需要的地方 – Steve

+0

它是一个很长的描述,为什么我需要从button_click事件处理程序,并调用从做到这一点。如果它不可能发布或告诉我如何去做。 – gurehbgui

+1

当一个人说*对不起,太复杂,不能解释为什么我需要做这件事* ... – Yuck

回答

3

您可以从代码触发Button_Click事件如下:

MyBtn.PerformClick(); 

你可以尝试这一个也:

MyBtn.Click(new object(), new EventArgs()); 
+0

Win Store应用程序中的按钮没有此方法。 – gurehbgui

+0

@gurehbgui:尝试更新的代码。 –

+0

这行代码MyBtn.Click(new object(),new EventArgs());'以许多不同的方式出错。 1.它不触发事件,它只是调用该方法。 2.不要创建新的对象,发送者应该始终是对象本身(MyBtn)3.不要使用新的EventArgs,而是使用'EventArgs.Empty' 4.如果你真的不想触发事件,但执行同样的方法一个按钮从你的代码中触发,你应该让click事件处理程序调用另一个方法。从你自己的代码中调用相同的方法。 –

1

您可以删除方法链接到你的事件(点击):

MyBtn.Click -= new EventHandler(Button_Click); 

并添加另一种方法:

MyBtn.Click += new EventHandler(FireClickEvent); 

所以,当你点击按钮时,将调用“FireClickEvent”方法而不是“Button_Click”。

要在代码执行点击:

MyBtn.PerformClick(); 
+0

是的,你可以 - 而且你不应该这样做。原因有二:(1)指定被点击的内容只会导致不太清晰的代码和(稍)难以改变的UI。 (2)PerformClick只是引发Click事件,因此只是调用该方法的一种低效方式。 –

+0

Win Store应用程序中的按钮没有此方法。 – gurehbgui

0

我使用这个小小的扩展来解雇从外面来的。 这是一种通用的(可以在任何类中引发任何事件),但我把它作为一个扩展方法来控制,因为这是不好的做法,我真的只有在其他一切都失败时才真正使用它。玩的开心。

public static class ControlExtensions 
{ 

    public static void SimulateClick(this Control c) 
    { 
     c.RaiseEvent("Click", EventArgs.Empty); 
    } 

    public static void RaiseEvent(this Control c, string eventName, EventArgs e) 
    { 

     // TO simulate the delegate invocation we obtain it's invocation list 
     // and walk it, invoking each item in the list 
     Type t = c.GetType(); 
     FieldInfo fi = t.GetField(eventName, BindingFlags.NonPublic | BindingFlags.Instance); 
     MulticastDelegate d = fi.GetValue(c) as MulticastDelegate; 
     Delegate[] list = d.GetInvocationList(); 

     // It is important to cast each member to an appropriate delegate type 
     // For example for the KeyDown event we would replace EventHandler 
     // with KeyEvenHandler and new EventArgs() with new KeyHandlerEventArgs() 
     foreach (EventHandler del in list) 
     { 
      del.Invoke(c, e); 
     } 

    } 

}